枚举ngRepeat中的子类数组

时间:2015-05-31 14:06:37

标签: javascript arrays angularjs angularjs-ng-repeat prototype

我想要一个可重复使用的列表,其中包含我自己的自定义行为(例如updateOrAppendByItemId),以通过ngRepeat保存检索到的数组以进行枚举。主要目的是保存实时馆藏 - 内容可以在本地或远程更改(通过SignalR)。它应该:

  • ng-repeat指令
  • 中正确枚举
  • 不将我的自定义行为呈现为项目(行)
  • 保留来自反序列化来源的排序顺序
  • 在现代浏览器中表现
  • 避免不必要的列表复制

一般如何构建?

在构建它时,我会立即遇到一些概念问题。 JavaScript Array无法进行子类化。将我的行为原型直接复制到Array实例会导致不希望的可枚举属性。在对象属性中存储内容会丢失源项目顺序。

这些问题中的每一个目前对我来说都只有理论上的严重性,现实后果依赖于未记录的AngularJS行为和浏览器差异。我希望之前触及过这个问题的人可以为我节省大量的试错。

研究

由于我开始进行那种我希望避免的可能冗长的调查,我会在这里发布我的工作。

Angular的ngRepeat首先测试集合isArrayLike()。如果是,它只是以数字方式遍历集合的长度。这似乎是非常有意的(虽然我不想依赖于内部函数isArrayLike()的解释)。

在我到目前为止测试的一个浏览器中,以下两个都没有改变有效的数组内容。

// safe
array.myMethod = true;
array['myMethod'] = true;

然而,以下是灾难性的:/ grin

array['5'] = true;

那就是ECMA spec

  

属性名称P(以String值的形式)是数组索引if   并且只有ToString(ToUint32(P))等于P且ToUint32(P)不等   等于232-1。

我可能不需要再继续了。我会尝试这个解决方案并报告回来。

0 个答案:

没有答案