Как я могу активировать $watch
переменную в директиве Angular при манипулировании данными внутри (например, вставляя или удаляя данные), но не назначать новый объект этой переменной?
У меня есть простой набор данных, который в настоящее время загружается из файла JSON. Мой контроллер Angular делает это, а также определяет несколько функций:
App.controller('AppCtrl', function AppCtrl($scope, JsonService) {
// load the initial data model
if (!$scope.data) {
JsonService.getData(function(data) {
$scope.data = data;
$scope.records = data.children.length;
});
} else {
console.log("I have data already... " + $scope.data);
}
// adds a resource to the 'data' object
$scope.add = function() {
$scope.data.children.push({ "name": "!Insert This!" });
};
// removes the resource from the 'data' object
$scope.remove = function(resource) {
console.log("I'm going to remove this!");
console.log(resource);
};
$scope.highlight = function() {
};
});
У меня есть функция, <button>
которая правильно вызвала $scope.add
функцию, и новый объект правильно вставлен в $scope.data
набор. Таблица, которую я установил, обновляется каждый раз, когда я нажимаю кнопку «добавить».
<table class="table table-striped table-condensed">
<tbody>
<tr ng-repeat="child in data.children | filter:search | orderBy:'name'">
<td><input type="checkbox"></td>
<td>{{child.name}}</td>
<td><button class="btn btn-small" ng-click="remove(child)" ng-mouseover="highlight()"><i class="icon-remove-sign"></i> remove</button></td>
</tr>
</tbody>
</table>
Однако директива, которую я установил для наблюдения $scope.data
, не запускается, когда все это происходит.
Я определяю свой тег в HTML:
<d3-visualization val="data"></d3-visualization>
Это связано со следующей директивой (обрезанной для разумности вопроса):
App.directive('d3Visualization', function() {
return {
restrict: 'E',
scope: {
val: '='
},
link: function(scope, element, attrs) {
scope.$watch('val', function(newValue, oldValue) {
if (newValue)
console.log("I see a data change!");
});
}
}
});
Я получаю "I see a data change!"
сообщение в самом начале, но никогда после того, как нажимаю кнопку «добавить».
Как я могу инициировать $watch
событие, когда я просто добавляю / удаляю объекты из data
объекта, а не получаю новый набор данных для назначения data
объекту?
источник
if
заявление.Ответы:
Вам необходимо включить глубокую проверку грязных объектов. По умолчанию angular проверяет только ссылку на переменную верхнего уровня, которую вы смотрите.
см. Область применения . Третий параметр функции $ watch включает глубокую грязную проверку, имеет ли он значение true.
Обратите внимание, что глубокая грязная проверка стоит дорого . Поэтому, если вам просто нужно наблюдать за дочерним массивом, а не за всей
data
переменной, следите за переменной напрямую.версия 1.2.x представила $ watchCollection
источник
Потому что, если вы хотите активировать свои данные с глубоким из них, вы должны передать 3-й аргумент
true
вашего слушателя. По умолчаниюfalse
это означает, что ваша функция будет запускаться, только когда ваша переменная изменится, а не поле .источник
Моя версия для директивы, которая использует jqplot для построения данных, когда они становятся доступными:
источник