Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angularjs select未将匹配模型标记为选中_Javascript_Angularjs_Angularjs Ng Options_Angularjs Ng Model - Fatal编程技术网

Javascript Angularjs select未将匹配模型标记为选中

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

我的ngModel在select中有问题,未显示为selected。id和名称都匹配,但不起作用,请参阅selectedState。将模型指向选项数组中的实际对象有效,请参见SelectedState2。不知道发生了什么

小提琴:


函数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"