我基本上希望在Backbone的集合中绑定到'add'和'remove'事件。我认为在AngularJS中基本上没办法做到这一点,我们已经解决的当前解决方法是$watch()
数组的length
并手动区分/重新计算整个事物。这真的是很酷的孩子吗?
编辑:具体来说,观察数组的长度意味着我不知道哪个元素已被更改,我需要手动“diff”。
答案 0 :(得分:31)
我认为使用$watch
是一个很好的解决方案,但$watchCollection
对您来说可能更好。 $watchCollection
不执行深度比较,只关注数组修改,例如插入,删除或排序(非项目更新)。
例如,如果您想让attribut order
与数组顺序保持同步:
$scope.sortableItems = [
{order: 1, text: 'foo'},
{order: 2, text: 'bar'},
{order: 3, text: 'baz'}
];
$scope.$watchCollection('sortableItems', function(newCol, oldCol, scope) {
for (var index in newCol) {
var item = newCol[index];
item.order = parseInt(index) + 1;
}
});
但是对于您的问题,我不知道是否有比手动浏览阵列更好的解决方案来识别更改。
答案 1 :(得分:12)
在Angular中观看数组的方法是$watch(array, function(){} ,true)
答案 2 :(得分:3)
我会创建子范围并单独观察它们。 这是一个例子:
$scope.myCollection = [];
var addChild = function()
{
var Child = $scope.$new();
Child.name = 'Your Name here';
Child.$watch('name', function(newValue) {
// .... do something when the attribute 'name' is changed ...
});
Child.$on('$destroy', function() {
//... do something when this child gets destroyed
});
$scope.myCollection.push(Child); // add the child to collection array
};
// Pass the item to this method as parameter,
// do it within an ngRepeat of the collection in your views
$scope.deleteButtonClicked = function(item)
{
var index = $scope.myCollection.indexOf(item); //gets the item index
delete $scope.myCollection[index]; // removes the item on the array
item.$destroy(); // destroys the original items
}
答案 3 :(得分:0)
请详细说明您的用例。跟踪元素持久性的解决方案之一是使用ngRepeat指令和监听元素的$ destroy事件的自定义指令:
<div ng-repeat="item in items" on-delete="doSomething(item)">
angular.module("app").directive("onDelete", function() {
return {
link: function (scope, element, attrs) {
element.on("$destroy", function () {
scope.$eval(attrs.onDelete);
});
}
}
});
答案 4 :(得分:0)
也许解决方案是创建集合类(就像骨干一样),你也可以很容易地挂钩事件。
我在这里所做的解决方案并不是非常全面,但是应该给你一个关于如何做到这一点的一般性指导。