我正在与角度手表阵列的方式搏斗。我有以下标记:
<map name="theMap" center="{{mapInfo.center.toUrlValue()}}" zoom="{{mapInfo.zoom}}" on-dragend="dragEnd()" on-zoom_changed="zoomChanged()">
<marker ng-repeat="pin in pins() track by pin.iconKey()" position="{{pin.latitude}}, {{pin.longitude}}" title="{{pin.streetAddress}}" pinindex="{{$index}}" on-click="click()"
icon="{{pin.icon()}}"></marker>
</map>
pin() 返回的每个单独的 pin 都有许多属性、子属性等。其中一个子属性控制标记颜色。当该子属性更改时,我希望 UI 更新。
因为 ng-repeat 似乎 $watch 只是基于对集合的更改,所以如何实现这一点并不明显。我认为我的跟踪函数 iconKey() 会这样做,因为它根据子属性的值返回不同的值。但这没有用。
另一件事:子属性在回调中从在指令下运行的 $interval 更改。我之所以提到这一点,是因为在之前的一篇文章中,有人认为可能存在上下文/范围问题。
但是,即使我在 UI 控制器中的事件侦听器中进行了更改(事件在 $interval 回调的“成功”子句中引发),它仍然不起作用。
这就是为什么我认为问题只是角度没有注意到 iconKey(); 的变化。它的行为就像 ng-repeat 的所有 $watches 都是数组的长度。子属性更改时不会更改。
更新
我创建了一个 plunker 来演示我面临的问题。您可以在http://plnkr.co/edit/50idft4qaxqw1CduYkOd找到它
这是我正在构建的应用程序的精简版本,但它包含基本元素(例如,保存有关地图引脚信息的数据上下文服务和用于切换引脚数组元素之一的子属性的 $interval 服务) .
您可以通过单击菜单栏中的开始来开始更新周期(您可能需要稍微向下拖动地图以将两个图钉都放在完整视图中)。它应该切换每个引脚的颜色,或者,每个 5 次,每 2 秒一次。它通过在控制器中定义的侦听器中切换 pin 对象的 isDirty 属性的值来实现这一点。该事件由 $interval 服务引发。
如果您在测试周期中中断第 22 行,您将看到返回的图钉图标。所以角度内的东西正在要求信息......但引脚颜色没有改变。
我期待有人迅速指出与我的任何理论无关的愚蠢错误:)。提前为我戴的任何眼罩道歉。
更新 2
在查看响应中的代码片段后,我简化了我的 plnkr 并证明 angular 实际上是在子属性更改时更新 UI。所以这似乎是 ng-map 中的一个限制或错误。