2014-09-07 5 views
14

Ich möchte eine Direktive, um HTML neu zu rendern, wenn drei Scope-Variablen geändert haben. Die ersten beiden sind nur ganze Zahlen, die dritte ist ein Array.

Wir haben $watchGroup mehreren Variablen zu beobachten, haben wir $watch mit objectEquality als dritter Parameter, und wir haben $watchCollection die wie $watch ist, aber mit objectEquality impliziert.

Gibt es eine Möglichkeit, eine ähnliche $ watch zu schreiben?

$scope.$watchGroup(['number1', 'number2', 'myArray'], callback, true); // true for objectEquality 
+0

Ich verwende AngularJS 1.3 –

Antwort

14

Nun scheint es wie WatchGroup eine tiefe Uhr nicht unterstützt. Wahrscheinlich können Sie also einen Hack machen, indem Sie einen anonymen Deep Watcher mit einem Array von Werten registrieren, die von der Watch-Funktion übergeben werden.

$scope.$watch(function(){ 
    return ['number1','number2','myArray'].map(angular.bind($scope, $scope.$eval)); 
    }, function(newV){ 
     console.log(newV); 
    },true); 

Demo

oder fügen Sie einfach diese Funktion als Nutzenfunktion auf dem rootScope und greifen Sie von irgendwelchen geerbt Bereichen.

.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); 
    } 
}); 

und von dem Controller zu tun:

$scope.deepWatchGroup(['number1','number2','myArray'],function(newV){ 
    console.log(newV); 
}); 

Demo

+3

Auf meinem Winkel 1.3.6 hatte ich auslagern 'thisScope' für' this, und benutze '$ scope.deepWatchGroup.call ($ scope, ['one', 'two'], Funktion (newVals) {})'. Danke für den schnellen Tipp! –

+0

Können Sie uns ein Beispiel dafür geben, wie Sie Morgan Delaney zur Arbeit bringen konnten? –

+0

Auch gibt es irgendeine Hilfe auf der neuesten Version auf Angular. 1.4.x? –

8

Wenn Sie ein Array von String Ausdrücke sehen wollen (dh Sie Funktionen nicht aufpassen müssen, was sowohl $watchGroup und PSL-Lösung kann umgehen), hier ist eine Alternative:

$scope.$watch('[number1, number2, myArray]', callback, true); 

Und wenn Sie möchten, eine Hilfsfunktion für das ähnlich machen PSL:

.run(function($rootScope){ 
    $rootScope.deepWatchGroup = function(watchExpressions, listener){ 
    this.$watch('[' + watchExpressions + ']', listener, true); 
    } 
}); 
+1

Funktioniert perfekt mit verschiedenen Arten von Variablen. – wmarquardt

Verwandte Themen