如何使用angular构建对象而不是数组

时间:2015-09-22 19:01:15

标签: javascript angularjs

我有一个控制器,它使用函数为关联数组添加时间:

crtl.items = [];
ctrl.build_array = function (code, item) {
  crtl.items[code] = item;
}

我的问题是关联数组在javascript中存在问题所以这可行:

<div>
  <p>{{ctrl.items['a']}}</p>
<div>

但这不是:

<div ng-repeat="item in ctrl.items">
  <p>{{item}}</p>
</div>

如何更改角度函数以便将项目添加到对象而不是关联数组?

2 个答案:

答案 0 :(得分:3)

对象和关联数组在JavaScript中是相同的。而且你最好不要通过提供类型的虚假提示来混淆引擎;此...

crtl.items = {}; // plain object, not an array!
ctrl.build_array = function (code, item) {
  crtl.items[code] = item;
}

...就足够了,因为你实际上也可以使用ng-repeat迭代对象:

<div ng-repeat="(key, item) in ctrl.items">
  <p>{{item}}</p>
</div>

引用the docs

  

您需要知道JavaScript规范没有定义   为对象返回的键的顺序。 (为了缓解Angular中的这个问题   1.3 ngRepeat指令用于按字母顺序对键进行排序。)

     

1.4版删除了字母排序。我们现在依赖订单   运行for key in myObj时由浏览器返回。看起来   浏览器通常遵循在订单中提供密钥的策略   尽管there are exceptions when keys are deleted and reinstated已经定义了它们。

     

如果不需要,建议的解决方法是转换您的   将对象转换为按您喜欢的顺序排序的数组   在提供给ngRepeat之前。你可以使用过滤器这样做   作为toArrayFilter或自己在对象上实现$watch

答案 1 :(得分:0)

你需要让ctrl.items成为像这样的对象:

      ctrl.items  = {}

像这样使用:

          <div ng-repeat="(code, value) in ctrl.items">
            <p>{{value}}</p>
          </div>