Как использовать $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);

Надеюсь, это поможет!