Angular:如何使用ngOptions填充动态数组以进行选择?

时间:2013-11-25 22:45:46

标签: arrays angularjs

理想情况下,我想通过computed属性填充数组。例如,

    Object.defineProperty(MyObj.prototype, 'linkedList', {
        get: function () {
            var list = [];
            this.dataList.forEach(function (cs) {
                if (cs !== this) {
                    list.push(cs.name);
                }
            });
            return list;
        }
    });

但是,如果我使用此计算属性作为选择选项,如

<select data-ng-model="name" data-ng-options="g for g in myObj.linkedList"></select>

我会收到此错误:

Error: 10 $digest() iterations reached. Aborting!

事实上,即使我返回一个固定列表,我仍然会收到此错误:

    Object.defineProperty(MyObj.prototype, 'linkedList', {
        get: function () {
            return ['test1', 'test2'];
        }
    });

但是,如果我返回一个静态数组就可以了:

MyObj._linkedList = ['test1', 'test2'];

  Object.defineProperty(MyObj.prototype, 'linkedList', {
        get: function () {
            return MyObj._linkedList;
        }
    });

我还尝试在ngOptions中使用过滤器,并抛出相同的错误。为什么和如何?

更新:

事实证明,我上面的原始问题并没有真正反映出问题,因为问题只有在我使用指令时才会发生。为简化问题,我删除了指令部分。

无论如何,在我的指令中,我有

    scope: {
        name: '=',
        isEditing: '=',
        isHidden: '=',
        options: '='
    }

<div>
    <div data-ng-hide="!isHidden" style="background-color: lightgrey">&nbsp;</div>
    <div data-ng-show="!isEditing && !isHidden">{{name}}</div>
    <select class="select-input"  data-ng-show="isEditing && !isHidden" data-ng-model="name" data-ng-options="g for g in {{options}}"><option value=""></option></select>
</div>

以下是如何使用它:

<td><ms-table-select-cell name="myObj.link" is-editing="myObj.isEditing" options="myObj.linkedList" /></td>

这是错误发生的方式。如果我直接使用带有ngOptions的select标签,那就不是问题了。

2 个答案:

答案 0 :(得分:0)

我认为问题是你的'get'属性在每个循环中被调用 您可以尝试分配变量值一次,然后循环它。

<select data-ng-model="name" data-ng-options="g for g in myArray = myObj.linkedList"></select>  

答案 1 :(得分:0)

在你的第一种情况下,每次角度调用myObj.linkedList它都会获得一个新对象,因此angular会重复开始新的摘要周期,直到迭代次数超过10次 - 而不是抛出错误“10 $ digest()迭代到达”。

为避免这种情况,您必须构造代码,以便每次调用myObj.linkedList都会返回相同的对象。

尝试将var list = [];表达式移出Object.defineProperty来电。

我准备了2个小提琴:
fiddle 1 - 错误
fiddle 2 - 没有错误和微小的修改。

比较他们 希望它能帮到你