Подтвердить что ты не робот

Как посмотреть массив для изменений в AngularJS

В основном я хочу, чтобы эквивалент был привязан к событиям "добавить" и "удалить" в коллекциях Backbone. Я вижу, что в AngularJS этого не происходит, и текущее обходное решение, которое мы установили, - это $watch() с массивом length и вручную различать/пересчитывать все это. Это действительно то, что делают крутые дети?

Изменить: В частности, просмотр длины массива означает, что мне нелегко узнать, какой элемент был изменен, мне нужно вручную "разбить".

4b9b3361

Ответ 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