如果对重复过滤的集合进行重复操作,则仅在启动和集合扩展时触发指令。如果你减少收藏,没有任何反应。
尝试
aa -> nothing happens
then
backspace -> directive called
中
这是我的HTML-Fragment
<div ng-app="myApp">
<div ng-controller="myCtrl">
<input type="text" ng-model="q">
<div ng-repeat="item in arr | filter:q" test>
{{item}}<br>
</div>
</div>
</div>
和我的Angular-Code
angular.module('myApp', [])
.controller('myCtrl', function($scope) {
$scope.arr = ['a','aa','aaa','ab','bb'];
})
.directive('test', function() {
return {
link: function(scope, element, attr) {
if (scope.$first)
alert("Directive called");
}
};
});
这是理想的行为吗? 这是一个缓存问题吗?
如何强制ng-repeat重新收集每次收集的变化?
更新
Michael的Plunkr
答案 0 :(得分:1)
这是理想的行为。仅当元素由link
创建时,才会调用ngRepeat
函数。因此,如果列表是第一次填充,则$first
在链接函数中是正确的。如果通过过滤器缩小列表,则不会重新创建其余元素,也不会调用链接函数。如果你点击后退按钮,就会创建一个新元素,现在调用该元素的链接函数。
我不太确定你想要实现什么,但我想你想在你的指令中知道元素是列表中的第一个元素。为实现此目的,我将$first
设置为指令test
的值:
<div ng-repeat="item in arr | filter:q" test="{{$first}}"
ng-class="{ active: $first || $last }">
{{item}}<br>
</div>
你的指令中的可以观察到这个值:
link: function(scope, element, attr) {
attr.$observe('test', function(newValue){
if(newValue=='true'){
console.log("Directive called..", newValue, scope.item);
}
});
}
每次元素成为列表中的第一个元素时,控制台都会打印出来。