2014-09-12 3 views
4

У меня есть вложенный массив вида:

$scope.itinerary = 
    [ 
     [ 
      {name:'x'}, 
      {name:'y'}, 
      {name:'z'} 
     ], 
     [ 
      {name:'a'}, 
      {name:'b'}, 
      {name:'c'} 
     ] 
    ] 

И я делаю $ watchCollection используя:

$scope.$watchCollection(function() { 
      return $scope.itinerary; 
     }, 
     function() { 
      console.log("Changed") 
     } 
); 

Но console.log() выполняется только если один из вспомогательных массивов удален или добавлен новый массив. Если я перемещу элемент из одного массива в другой, ничего не произойдет. (например, когда я перемещаю {name:'a'} из одного массива в другой, ничего не происходит). Как поставить часы на вложенный массив?

ответ

8

Использование глубокой часы Функции $ часов() принимает третий, дополнительный аргумент для "объекта равенства." Если вы передадите «истину» для этого аргумента, AngularJS фактически выполнит сравнение с объектом с глубоким объектом. Это означает, что в каждом $ digest AngularJS проверит, имеют ли новые и старые значения одинаковые структуры (а не только одну и ту же физическую ссылку). Это позволяет отслеживать больший ландшафт; однако сравнение данных с глубокими объектами намного дороже.

$scope.$watch('itinerary',function (newVal,oldVal) { 
      console.log(newVal)  

},true); 
1

Вместо того, чтобы использовать $ watchCollection, вы должны использовать $ watch с третьим аргументом, установленным в true.

Это будет работать, но это также плохая идея для производительности, если массив большой, поэтому используйте с осторожностью.

Сравнение выполняется с использованием угловых.ячейков по сравнению с скопированным объектом, полученным с помощью угловой.copy.

Подробнее на https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope # $ часов

Смежные вопросы