Как посмотреть массив для изменений в AngularJS
В основном я хочу, чтобы эквивалент был привязан к событиям "добавить" и "удалить" в коллекциях Backbone. Я вижу, что в AngularJS этого не происходит, и текущее обходное решение, которое мы установили, - это $watch()
с массивом length
и вручную различать/пересчитывать все это. Это действительно то, что делают крутые дети?
Изменить: В частности, просмотр длины массива означает, что мне нелегко узнать, какой элемент был изменен, мне нужно вручную "разбить".
Ответы
Ответ 1
Я думаю, что использование $watch
является хорошим решением, но $watchCollection
может быть лучше для вы. $watchCollection
не выполняет глубокого сравнения и просто следит за модификацией массива, как вставка, удаление или сортировка (не обновление элемента).
Например, если вы хотите сохранить атрибут 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;
}
});
Но для вашей проблемы я не знаю, есть ли лучшее решение, чем вручную просмотреть массив, чтобы определить изменение.
Ответ 2
Способ просмотра массива в Angular равен $watch(array, function(){} ,true)
Ответ 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
}
Ответ 4
Расскажите, пожалуйста, больше о вашей учетной записи. Одним из решений прослеживания элементов отслеживания является использование директивы ngRepeat с пользовательской директивой о том, что элемент прослушивания $destroy event:
<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);
});
}
}
});
Ответ 5
Возможно, решение состоит в том, чтобы создать класс коллекции (например, позвоночник), и вы можете легко вписаться в события.
Решение, которое я здесь сделал, действительно не является исчерпывающим, но должно дать вам общее руководство о том, как это возможно сделать.
http://beta.plnkr.co/edit/dGJFDhf9p5KJqeUfcTys?p=preview