#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, функция прослушивания в обоих методах получит в качестве аргументов новый список и старый список, так что вы можете выполнить итерацию по обоим спискам и сравнить их.