применение $ для просмотра списка переменных области видимости

#angularjs

#angularjs

Вопрос:

у меня есть некоторые переменные области видимости, такие как ‘a1, a2, a3, a4, … an’, я хочу применить $ watch ко всем этим переменным области видимости.Возможно ли применить это в одной функции просмотра, как показано ниже.

 var list=['a1','a2','a3',...,'an']
for (var i=0;i<list.length;i  ){
    $scope.$watch(list[i],function(){
     alert(list[i] 'changed');
    })
}
  

Комментарии:

1. Используете ли вы это с ng-repeat?

2. да, я использую его с ng-repeat.

Ответ №1:

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

  $scope.$watch(function(){ 
     var list=['a1','a2','a3',...,'an'];
     values="";
     angular.forEach(list,function(item){
          values =($scope[item]) '_';
     })
     return values;
   },function(){
       //do something here with the values

    })
  

это работает, если есть все значения, если у вас есть объекты для просмотра, вам нужно выполнить JSON.stringify для переменных, чтобы получить их состояние. также это решение применимо только в том случае, если знание того, кто изменил, не имеет значения для выполнения операции, т. е. вычисления общего количества, соотношения или проверки работоспособности для того, какие значения должны быть постоянными

Ответ №2:

При использовании ng-repeat вы можете назначить контроллер для каждого элемента (здорово, да!)

если у вас есть это:

 <div ng-repeat="element in elements" ng-controller="ElementController"></div>
  

Вы можете посмотреть это следующим образом:

 angular.module(...).controller('ElementController', function ($scope) {
    $scope.$watch('element.some_name', function (someName) {

    });
});
  

Этот контроллер все еще должен иметь доступ к родительской области видимости.

Ответ №3:

Вы можете попробовать $ watchCollection:

 $scope.list = ['a1','a2','a3',...,'an'];
$scope.$watchCollection('list', function(newList, oldList){...});
  

Или просто используйте обычный $watch с массивом:

 $scope.$watch('[a1, a2,...]', function(newList, oldList){...});
  

Комментарии:

1. Ваш ответ верен. но что, если мы хотим проверить, значение какого элемента изменено, и если мы хотим отобразить новое и старое значения одного и того же элемента?

2. $watchCollection передает новую и старую коллекции в качестве аргументов функции listener, поэтому, я думаю, вы можете сравнить их. но это не идеальное решение

3. Нет, я думаю, это не так. он просто сообщает вам, является ли newValue ==oldValue или нет. но что, если вы хотите отследить измененный элемент? было бы неплохо, если бы вы могли помочь.

4. Вы можете сравнить это, функция прослушивателя должна быть передана в качестве второго аргумента (не первого), но она может сравнивать только два массива. в этом массиве нет ни одного элемента

5. @micronyks, функция прослушивания в обоих методах получит в качестве аргументов новый список и старый список, так что вы можете выполнить итерацию по обоим спискам и сравнить их.