ng-options模型基于属性绑定

时间:2016-01-18 20:18:34

标签: javascript angularjs

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

我有像

这样的对象结构
fail

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

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

但是,有没有办法让TestObj绑定到TestArr中具有相同“name”属性的对象?

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

我不建议按照jsfiddle中的示例进行操作。基本上,您不需要TestObj AND 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