Как смотреть несколько переменных?

У меня есть две переменные $scope. Они называются $scope.image и $scope.titleimage.

В основном хранилище того же типа содержимого. Я хочу отслеживать сейчас, когда один из них обновляется. Но до сих пор я не мог понять, как иметь две переменные, отслеживаемые в одном обратном вызове $scope.$watch().

// How can I watch titleimage here as well?
$scope.$watch('image', function(media) {
    console.log('Media change discoverd!');
}); 

Ответ 1

$watch метод принимает функцию как первый параметр (рядом с строкой). $watch будет "наблюдать" возвращаемое значение функции и вызывать прослушиватель $watch, если возвращаемое значение изменено.

$scope.$watch(
  function(scope){
    return {image: scope.image, titleImage: scope.titleImage};
  }, 
  function(images, oldImages) {
    if(oldImages.image !== images.image){
      console.log('Image changed');
    }
    if(oldImages.titleImage !== images.titleImage){
      console.log('titleImage changed');
    }
  }, 
  true
); 

Также вы можете наблюдать сцепленное значение, но это не позволяет вам узнать, какое из наблюдаемых значений действительно изменилось:

$scope.$watch('image + titleImage',
  function(newVal, oldVal) {
    console.log('One of the images have changed');
  }
); 

И вы также можете посмотреть массив переменных области видимости:

$scope.$watch('[image, titleImage]',
  function(images, oldImages) {
    if(oldImages[0] !== images[0]){
      console.log('Image changed');
    }
    if(oldImages[1] !== oldImages[1]){
      console.log('titleImage changed');
    }
  },
  true
); 

Ответ 2

Предложения Stewie будут работать. Но есть тысячи способов обмануть этого кота. Я бы сказал, что если вы смотрите два отдельных значения, нет ничего плохого в настройке двух часов для них с общей функцией между ними:

функциональное программирование на помощь!

Использование функций для создания функций является удивительным.

function logChange(expr) {
   return function(newVal, oldVal) {
      console.log(expr+ ' has changed from ' + oldVal + ' to ' + newVal);
   };
}

$scope.$watch('image', logChange('image'));
$scope.$watch('titleImage', logChange('titleImage'));

ИЛИ... вы можете даже обернуть настройку часов в своей собственной функции (гораздо менее захватывающей, IMO):

function logChanges(expr) {
   $scope.$watch(expr, function(newVal, oldVal) {
      console.log(expr+ ' has changed from ' + oldVal + ' to ' + newVal);
   });
};

logChanges('image');
logChanges('titleImage');

.. но у меня есть тысяча из них, вы говорите?

//assuming the second function above
angular.forEach(['image', 'titleimage', 'hockeypuck', 'kitchensink'], logChanges);