我想要一个可重复使用的列表,其中包含我自己的自定义行为(例如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。
我可能不需要再继续了。我会尝试这个解决方案并报告回来。