不使用ng-repeat重新调用Angular指令

时间:2014-07-02 20:18:10

标签: javascript angularjs

我对元素以及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类似。

1 个答案:

答案 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。