Как использовать $watchGroup с равноправием объектов или глубоко следить за свойствами в группе?
Мне нужна директива для повторной обработки HTML всякий раз, когда меняются три переменные области видимости. Первые два являются целыми числами, третий - массивом.
У нас есть $watchGroup
, чтобы смотреть несколько переменных, мы имеем $watch
с objectEquality
в качестве третьего параметра, и мы имеем $watchCollection
, который похож на $watch
, но с objectEquality
подразумевается.
Есть ли способ написать $watch, подобный этому?
$scope.$watchGroup(['number1', 'number2', 'myArray'], callback, true); // true for objectEquality
Ответы
Ответ 1
Ну, похоже, что watchGroup не поддерживает глубокие часы. Так что, возможно, вы можете взломать, зарегистрировав анонимного глубокого наблюдателя с массивом значений, передаваемых из функции watch.
$scope.$watch(function(){
return ['number1','number2','myArray'].map(angular.bind($scope, $scope.$eval));
}, function(newV){
console.log(newV);
},true);
Демо
или просто добавьте эту функцию в качестве функции утилиты на rootScope и получите доступ к ней из любых унаследованных областей.
.run(function($rootScope){
$rootScope.deepWatchGroup = function(exp, callback){
if(!angular.isArray(exp) || !thisScope.$watch) return; //Or log some error if array is not passed in or the context is not really a scope object
var thisScope = this, //get scope
evalFunc = angular.bind(thisScope, thisScope.$eval); //and a bound eval func
thisScope.$watch(function(){
return exp.map(evalFunc); //return array of evaluated values
}, callback,true);
}
});
и от вашего контроллера выполните:
$scope.deepWatchGroup(['number1','number2','myArray'],function(newV){
console.log(newV);
});
Демо
Ответ 2
Если вы хотите посмотреть массив выражений string (т.е. вам не нужно смотреть функции, которые могут обрабатывать как $watchGroup
, так и решение PSL), вот альтернатива:
$scope.$watch('[number1, number2, myArray]', callback, true);
И если вы хотите сделать функцию утилиты для того, что аналогично PSL:
.run(function($rootScope){
$rootScope.deepWatchGroup = function(watchExpressions, listener){
this.$watch('[' + watchExpressions + ']', listener, true);
}
});
Ответ 3
У меня тоже была такая же проблема, как и у тебя.
Мое решение этой глубокой проблемы группы наблюдения:
// Create new object to watch different types of objects
var objectToBeWatch = {
number1: number1,
number2: number2,
myArray: myArray
};
$scope.$watch(
function () {
return objectToBeWatch;
}, callback, true);
Надеюсь, это поможет!