AngularJS:选择在更改绑定范围变量时不更改选定选项

Ale*_*kov 8 javascript angularjs

我有一个选择控件.它的选项是从作用域的对象数组动态生成的.在app init上,我想通过更改范围上的绑定变量来选择特定选项.

当select的ng-option返回完整对象时,它不起作用.但是,当select的ng-option返回字符串时,它可以工作.

是角虫还是我做错了什么?

HTML:

<div ng-controller="selectCtrl" ng-app>
    Doesn't work when select's ngModel value is object:<br />
    <select ng-model="valueObject" ng-options="o.label for o in options"></select><br />
    <pre>{{valueObject | json}}</pre>

    Works when select's ngModel value is string:<br />
    <select ng-model="valueString" ng-options="o.value as o.label for o in options"></select>
    <pre>{{valueString | json}}</pre>    
Run Code Online (Sandbox Code Playgroud)

JS:

function selectCtrl($scope) {    
   $scope.options = [
       {label: 'a', value: '1', someId: 333},
       {label: 'b', value: '2', someId: 555}
   ];    
   $scope.valueObject = {label: 'a', value: '1', someId: 333};
   $scope.valueString = '1';
};
Run Code Online (Sandbox Code Playgroud)

JS小提琴:http://jsfiddle.net/apuchkov/FvsKW/6/

Ale*_*kov 9

在我的问题工作中,必须使用"跟踪"表达式表示.更多细节:http://leoshmu.wordpress.com/2013/09/11/making-the-most-of-ng-select/

更新了JsFiddle:http://jsfiddle.net/apuchkov/FvsKW/9/

HTML

<div ng-controller="selectCtrl" ng-app>
    Doesn't work when select's ngModel value is object:<br />
    <select ng-model="valueObject" ng-options="o.label for o in options"></select><br />
    <pre>{{valueObject | json}}</pre>

    Does work when select's ngModel value is object AND 'track by' expression is used:<br />
    <select ng-model="valueObject" ng-options="o.label for o in options track by o.value"></select><br />
    <pre>{{valueObject | json}}</pre>
</div>
Run Code Online (Sandbox Code Playgroud)

JS

function selectCtrl($scope) {    
    $scope.options = [
        {label: 'a', value: '1', someId: 333},
        {label: 'b', value: '2', someId: 555}
    ];    
    $scope.valueObject = {label: 'a', value: '1', someId: 333};
};
Run Code Online (Sandbox Code Playgroud)


Sea*_*ira 5

关键是具有相同键和值的对象彼此不相等(参考ES 5.1规范11.9.6):

// Return true if x and y refer to the same [in-memory] object.
// Otherwise, return false.
> var one = {label: 'a', value: '1', someId: 333}
> var two = {label: 'a', value: '1', someId: 333}
> one === one
true
> two === two
true
> one === two
false
> one == two
false
Run Code Online (Sandbox Code Playgroud)

更改$scope.valueObject = { /* similar object */ }$scope.valueObject = $scope.options[0],一切都应该工作.