¿Cómo puedo activar una $watch
variable en una directiva angular al manipular los datos en su interior (por ejemplo, insertar o eliminar datos), pero no asignar un nuevo objeto a esa variable?
Tengo un conjunto de datos simple actualmente cargado desde un archivo JSON. Mi controlador angular hace esto, además de definir algunas funciones:
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() {
};
});
Tengo una <button>
que llama correctamente la $scope.add
función, y el nuevo objeto se inserta correctamente en el $scope.data
conjunto. Una tabla que configuré se actualiza cada vez que presiono el botón "Agregar".
<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>
Sin embargo, una directiva que configuré para mirar $scope.data
no se dispara cuando todo esto sucede.
Defino mi etiqueta en HTML:
<d3-visualization val="data"></d3-visualization>
Que se asocia con la siguiente directiva (recortada para la cordura de la pregunta):
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!");
});
}
}
});
Recibo el "I see a data change!"
mensaje al principio, pero nunca después cuando presiono el botón "agregar".
¿Cómo puedo activar el $watch
evento cuando solo estoy agregando / quitando objetos del data
objeto, sin obtener un conjunto de datos completamente nuevo para asignar al data
objeto?
fuente
if
declaración.Respuestas:
Debe habilitar la comprobación sucia de objetos profundos. Por defecto, angular solo verifica la referencia de la variable de nivel superior que observa.
ver Alcance . El tercer parámetro de la función $ watch permite una verificación profunda y sucia si está configurado en verdadero.
Tenga en cuenta que la verificación sucia profunda es costosa . Entonces, si solo necesita ver la matriz de niños en lugar de la
data
variable completa , mire la variable directamente.la versión 1.2.x introdujo $ watchCollection
fuente
Porque si desea activar sus datos con profundidad, debe pasar el 3er argumento
true
de su oyente. Por defecto, esfalse
y significa que su función se activará, solo cuando su variable cambie, no su campo .fuente
Mi versión para una directiva que usa jqplot para trazar los datos una vez que esté disponible:
fuente