Javascript Angularjs select未将匹配模型标记为选中
我的ngModel在select中有问题,未显示为selected。id和名称都匹配,但不起作用,请参阅selectedState。将模型指向选项数组中的实际对象有效,请参见SelectedState2。不知道发生了什么 小提琴:Javascript Angularjs select未将匹配模型标记为选中,javascript,angularjs,angularjs-ng-options,angularjs-ng-model,Javascript,Angularjs,Angularjs Ng Options,Angularjs Ng Model,我的ngModel在select中有问题,未显示为selected。id和名称都匹配,但不起作用,请参阅selectedState。将模型指向选项数组中的实际对象有效,请参见SelectedState2。不知道发生了什么 小提琴: 函数MainCtrl($scope){ $scope.stateOptions=[ {id:1,名字:“阿拉斯加”}, {id:2,姓名:“蒙大拿州”}, {id:3,名字:“内布拉斯加州”}, {id:4,名字:“德克萨斯州”} ] $scope.selecte
函数MainCtrl($scope){
$scope.stateOptions=[
{id:1,名字:“阿拉斯加”},
{id:2,姓名:“蒙大拿州”},
{id:3,名字:“内布拉斯加州”},
{id:4,名字:“德克萨斯州”}
]
$scope.selectedState={id:2,名称:“蒙大拿”};
$scope.selectedState2=$scope.stateOptions[1];
}
这是因为每个对象都有自己的$hashKey
,由Angular提供,Angular用来确定它们是否相同。您正在$scope.selectedState
上创建一个新对象(使用不同的$hashKey
)。在$scope.selectedState2
上设置它的方式是正确的
您还可以使用track by
按state.id
而不是对象的$hashKey
进行角度跟踪:
<select ng-model="selectedState" ng-options="state.name for state in stateOptions track by state.id"></select>
设置$scope.selectedState时,实际上是在创建一个新的javascript对象,它不是$scope.stateOptions的元素。因此,select元素不会从$scope.stateOptions中选择相应的元素 如果需要按唯一属性值选择项目,可以在选择表达式中使用“跟踪依据” 尝试添加
ng选项声明末尾的Track by state.id。Angular团队在ngSelect的文档中说明了此问题: 注意:ngModel通过参考进行比较,而不是通过值进行比较。这在绑定到对象数组时很重要。请参见本文中的示例
如果提供的对象作为模型不包含对现有列表的引用,则使用模型的唯一值
track by
,这样ng选项将使用您在track by中提供的属性来跟踪正在设置的ng模型,而不是使用自定义唯一$$hashKey
ng-options="state.name for state in stateOptions track by state.id"
它不仅在将ng模型设置为任何引用时非常有用,而且还具有很大的性能有效性,尤其是当您的列表刷新时,元素不会被删除和重新创建,而只会更新现有元素
这是一个。我认为Angular使用引用检查,而不是比较两个具有相同属性的对象。在您的例子中,$scope.selectedState2返回一个不同的对象。我通常使用understore从数组中查找所选项目进行初始化。根据ng选项的工作方式,这并不完全正确,您可以始终按某个对象进行跟踪,并将模型设置为该属性值。另一种方法是使用
值作为..
语法中项的名称。您无法始终知道所选项目在数组中属于哪个索引(除非您通过循环获得一个非常低效的匹配)@PSL这是基于Angular团队文档的,如果它不完整Angular团队也犯了同样的错误。
$scope.options = [
{ label: 'one', value: 1 },
{ label: 'two', value: 2 }
];
// Although this object has the same properties as the one in $scope.options,
// Angular considers them different because it compares based on reference
$scope.incorrectlySelected = { label: 'two', value: 2 };
// Here we are referencing the same object, so Angular inits the select box correctly
$scope.correctlySelected = $scope.options[1];
ng-options="state.name for state in stateOptions track by state.id"