2016-11-14 2 views
0

КонтекстWatch директива сфера не работает

мой контроллер хранит массив. При нажатии специальной клавиши на клавиатуре я добавляю новый объект в этот массив.

Массив используется внутри директивы для отображения диаграммы.

Таким образом, при нажатии на ярлык диаграмма должна обновляться с новым значением.

Контроллер

vm.observation = [{ 
    "sale": "202", 
    "year": "2010" 
}, { 
    "sale": "215", 
    "year": "2011" 
}, { 
    "sale": "179", 
    "year": "2012" 
}, { 
    "sale": "199", 
    "year": "2013" 
}, { 
    "sale": "134", 
    "year": "2014" 
}, { 
    "sale": "176", 
    "year": "2015" 
}]; 

Директива

angular.module('spwApp.directives') 
    .directive('linechart', [function() { 
     return { 
      restrict: 'E', 
      scope: { 
       id: "@", 
       observation: "=" 
      }, 
      link: function($scope, element, attrs) { 
       $scope.$watch("observation", function(newVal, oldVal){ 
        console.log("OBS : " + newVal); 
       }, true); 
      } 
     } 
    }]) 

HTML

<linechart id="linechart3" observation="vm.observation"></linechart> 

При загрузке страницы й e chart правильно отображает данные, а консоль правильно регистрируется внутри $watch.

В любом случае после нажатия ярлыка $watch не срабатывает, тогда как массив обновляется

Я не могу найти ошибку в своем коде

+0

Попробуйте использовать $ watchCollection вместо $ watch – George

+0

@Sajeetharan Теперь он входит в '$ watch()', но генерирует эту ошибку '$ apply уже в процессе' – Weedoze

+0

@GeorgeLee Кажется, что это работает. Не могли бы вы отправить сообщение и ответить с объяснением? – Weedoze

ответ

2

Вы что-то добавить в массив, но сам массив остается одна и та же. Регулярный наблюдатель реагирует только на значение, которое изменяется. Вот почему Угловое также $watchCollection:

$scope.$watchCollection("observation", 

$watchCollection также контролирует содержимое массива, т.е. он проверяет, является ли что-то удалены или добавлены.

+1

В значительной степени это, используя $ watch, он собирается. Array по-прежнему равен массиву, поэтому никаких изменений не существует, вы также можете использовать '$ scope. $ Watch ('observ', function(), true)' true будет делать "глубокий «сравнение, но это связано с достижением производительности – George

+0

@GeorgeLee. Вы правы в использовании глубокого сравнения, но' $ watchCollection' является более эффективным/совершенным. – zeroflagL