我对元素以及ct-steps-tooltip
都有一个指令ng-repeat
,如下所示:
<div id='courseSteps'
class='relative ease {{step.action.toLowerCase()}}'
ng-repeat='step in currentItem.userData.steps | filter:{action: filterSteps} track by $index'
ng-class='{"completed": step.endDate, "pointer": step.action==="Submit" && !step.endDate}'
ng-click='getRelated(step, $index)'
ct-steps-tooltip
ct-step-name="step.stepName"
ct-step-description="step.description"
ct-action="step.action"
ct-value-text="step.valueText"
ct-quantity='steps.length'
ct-completed='currentItem.steps.completedSteps'
ct-start-date='step.startDate'
ct-end-date='step.endDate'>
<div ng-show='step.endDate' class="stepCompleteCheck absolute"></div>
<div> {{ step.stepName }} </div>
</div>
我的目标是在currentItem.userData.steps
发生更改时(我实际上完全清除currentItem
然后重新分配它),让指令重新绑定/再次调用。这实际上在this simplified fiddle我做的很好。在小提琴中你可以清楚地看到“我被叫了!”每次更改数据时都在控制台中。由于某种原因,实际代码中的ct-steps-tooltip
指令仅在第一次被调用时,并且在数据发生变化时不再被调用(我在真实指令{{我有一个类似的“我被调用”消息) 1}}功能)。我在破坏此功能的真实代码中做了什么?
编辑:注意到OCCASIONALLY指令IS在数据更改时再次被调用。它发生在10%的时间。我现在的问题似乎与this one类似。
答案 0 :(得分:9)
数据无法刷新,因为在ngRepeat
表达式中,您指定了track by $index
。
更新currentItem
后,即使实际的对象不同,steps
数组中对象的索引也会保持不变。< / p>
因此,角度不会更新转发器,因为$index
没有改变,我们正在通过此$index
变量跟踪步骤对象。删除转发器表达式的track by
部分,您的问题将得到解决。
track by
仅在向转发器中的数组添加对象或从对象中删除对象时才有用,而不是在更改整个数组时。例如,如果您有一本包含100本书籍的列表,并且您向该数组中添加了一本书(没有track by
),则将重新呈现整本101本书籍。您可以使用track by book.id
告诉角度,转发器中的原始100本书没有更改,并且只为我们添加的单本书提供dom。