2014-09-21 2 views
1

У меня есть два массива в моем заявлении я хотел бы наблюдать изменения:Как смотреть больше одной коллекции в Angular?

$scope.a = [{id: 1, text: 'test a - 1'}, ...]; 
$scope.b = [{id: 1, text: 'test b - 1'}, ...]; 

function changed(){ 
    // notify application about changes in a or b 
} 

Я должен вызвать функцию changed() когда a или b был изменен.

$scope.$watchCollection('a', changed); 
$scope.$watchCollection('b', changed); 

changed() обратного вызова будет срабатывать дважды, если у меня есть изменения в a и b, а также на этапе инициализации. Я хотел бы объединить две часы в одном, что-то вроде этого:

$scope.$watchCollection('a, b', changed); 

Как я могу это сделать с помощью углового?

+0

Удачи с любым из этих ответов? – PSL

ответ

3

Есть что-то под названием watchGroup, которое вы можете использовать для этой цели, но, к сожалению, в основном бесполезно, так как это только мелкие часы.

Вы можете использовать функцию наблюдател, чтобы вернуть объект

$scope.$watch(function(){ //Or even try this with watchCollection 
    return ['a','b'].map(angular.bind($scope, $scope.$eval)); 
    }, function(newV){ 
     console.log(newV); 
    },true); 

Вы могли бы вместо create a custom watcher for your convenience as i had mentioned in another answer и сделать что-то вроде этого.

$scope.deepWatchGroup(['a','b'],function(newV){ 
    console.log(newV); 
}); 
+2

Отличный ответ! +1 – Josep

1

Использование $scope. $watch('a+b', change). Вы можете добавить любое количество переменных для просмотра

+0

Спасибо, я попробую это, но я не уверен, что он будет работать для массивов объектов. – Warlock

+0

@Warlock добавить третий аргумент 'true', тогда он будет работать для массивов – worldask

+0

Это выглядит интересно, но я сомневаюсь, что это сработает, потому что a + b будет конкатенировать 2 объекта и приведет к' [object Object] [object Object] ", "[object Object] [object Object]" 'http://plnkr.co/edit/Q2GzAo?p=preview – PSL

Смежные вопросы