可能您可以创建一个指令并将其与 ng-repeat 一起添加,因此该指令在创建时(当由 ng-repeat 添加项目时)将发出一个事件,同样,当项目被销毁时它会发出另一个事件。
这里有一个简单的实现:
.directive('tracker', function(){
return{
restrict:'A',
link:function(scope, el, attr){
scope.$emit('ITEM_ADDED', scope.$eval(attr.tracker))
scope.$on('$destroy', function(){
scope.$emit('ITEM_REMOVED', scope.$eval(attr.tracker))
});
}
}
});
并将其用作:
<some-element
ng-repeat="singleRecord in arrayOfRecords track by singleRecord.id"
tracker="item">
例如,在父控制器上监听这些事件。
演示
或者使用函数绑定但以不同的方式,而不使用隔离范围。
.directive('tracker', function() {
return {
restrict: 'A',
link: function(scope, el, attr) {
var setter = scope.$eval(attr.tracker);
if(!angular.isFunction(setter)) return;
setter({status:'ADDED', item:scope.$eval(attr.trackerItem)});
scope.$on('$destroy', function() {
setter({status:'REMOVED', item:scope.$eval(attr.trackerItem)});
})
}
}
});
演示
上面的问题是针对您的问题的,因为没有其他内置方法,请注意,如果您要真正找出添加/删除的项目,您也可以通过区分 2 个列表在控制器中执行此操作。您可以尝试使用类似 lodash api_.unique
甚至简单的循环比较来查找结果。
function findDif(oldList,newList){
return {added:_.uniq(newList, oldList), removed:_.uniq(oldList, newList)};
}
演示