嗨,我是角度编程的新手,我对角度的ng-options有疑问。

我有一个像这样的对象结构

TestObj: { name: 'Name1', subNames: ['Subname1'] }
TestArr:
    [{ name: 'Name1', subNames: ['Subname1'] },
    { name: 'Name2', subNames: ['Subname1'] },
    { name: 'Name3', subNames: ['Subname1'] }]


而且我正在尝试使用ng-options将其中一个TestArr对象绑定到TestObj。

<select class="touchpoint-settings-create-channel-box ng-model="TestObj" ng-options="curTest.name for curTest in TestArr"></select>


但是,有什么方法可以使TestObj绑定到TestArr中具有相同“名称”属性的对象?

这个jsfiddle是我的意思的一个很好的例子。 http://jsfiddle.net/KN9xx/840/

第一次启动时,selectedPerson被设置为与数组中第一项相似的对象,但是ng-options并没有意识到它是同一对象。

谢谢

最佳答案

我不建议遵循该jsfiddle中的示例。本质上,您不需要TestObj和TestArr。如果TestObj不仅是对TestArr的引用,那么它们将不会是同一对象,并且您正在复制数据,因为当Angular和JavaScript作为独立的对象时,它们无法识别这两个对象具有相同的键和值。

您应该遵循以下SO帖子中的示例:How to have a default option in Angular.js select box

不用像以前那样使用TestObj,而是使用ng-init设置默认值。

var TestArr =
    [{ name: 'Name1', subNames: ['Subname1'] },
    { name: 'Name2', subNames: ['Subname1'] },
    { name: 'Name3', subNames: ['Subname1'] }];

<select
  class="touchpoint-settings-create-channel-box
  ng-init="TestObj = options[0]"
  ng-model="TestObj"
  ng-options="option.name for option in TestArr">
</select>


为了说明我对对象的观点:

var obj1 = { name: 'Me' };
var obj2 = { name: 'Me' };


尽管obj1obj2看起来完全相同,但是变量只是对基础对象的引用,而不是值,并且JS解释器不知道我希望这两个对象都相同。但是,如果您输入字符串或数字,它会按预期运行。

var me = 'Me';
var stillMe = 'Me';

console.log(obj1 === obj2); // prints false
console.log(me === stillMe); // prints true

10-06 15:27