17

Ich möchte in der Lage sein, eine Direktive zu benachrichtigen, wenn ein Ereignis passiert, was die Direktive ändert. Ich weiß, dass Richtlinien nur einmal laufen, also frage ich mich, wie ich das machen würde. Ich bin mir auch nicht sicher, ob ich $ emit oder $ broadcast verwenden soll, ist eine Direktive ein Kind des Controllers?

Zum Beispiel in meinem Controller ich habe:

$rootScope.$emit('PHOTO_UPLOADED', photo);

Und in meiner Richtlinie:

.directive('photo', [function() { 
    return { 
    restrict: 'EA', 
    scope: {user: '='}, 
    replace: true, 
    template: '<div id="{{user.id}}"></div>', 
    link: function ($scope, element, attrs) { 
     var thumbnail = ($scope.user && $scope.user.image) 
     ? $scope.user.image 
     : '/default.png'; 

     element.css('background-image', 'url(' + thumbnail + ')'); 

     $rootScope.$on('PHOTO_UPLOADED', function(event, data) { 
     thumbnail = data; 
     }); 
    } 
    }; 
}]) 

Ich habe versucht, dies zu tun, aber es ist nichts passiert, wurde die Vorschau nicht aktualisiert, da die Direktive lief schon.

Antwort

24

Verwenden Sie $broadcast. Dadurch werden Ereignisse an untergeordnete Bereiche gesendet. Hier ist ein Beispiel für Broadcast unter Verwendung von Daten zu einer Richtlinie von einer übergeordneten Steuerung zu senden:

http://jsfiddle.net/smaye81/q2hbnL5b/6/

+0

die Sendung Ereignis fangen .... beides tun, Alter? –

2

Sie müssen sicherstellen, dass $rootScope auf Ihre Anweisung übergeben, damit es injiziert werden kann:

.directive('photo', ['$rootScope', function($rootScope) { 
// snip 
}]); 

Ändern Sie die erste Zeile des Codes zu den oben genannten und es sollte gut funktionieren.

5

In Ihrem Controller tun:

$rootScope.$broadcast('PHOTO_UPLOADED', photo); 

und in der Richtlinie über

$rootScope.$on('PHOTO_UPLOADED', function(event, data) { 
     thumbnail = data; 
     }); 
Verwandte Themen