2012-11-15 24 views
8

ich ein Problem habe, wo $ rootScope $ Broadcast-Ereignisse werden nicht gefeuert zu werden.

App.run(function($rootScope){ 
    var text = 'Not So Static Now'; 
    $rootScope.$broadcast('event:staticText', text); 
}).$inject = ['$rootScope']; 


App.controller('Ctrl1', function($scope, $rootScope) { 
    $scope.staticText = "Static Text"; 

    var things = [ 
     'AngularJS', 
     'StackOverflow', 
     'JSFiddle' 
    ]; 

    $scope.$emit('event:things', things); 

    $scope.$on('event:staticText', function(e, args){ 
     $scope.staticText = args; 
    }); 

}).$inject = ['$scope', '$rootScope']; 

Die oben sollte die ändern {{StaticText-}} Ausgabe auf ‚Not So Static Now 'aber es tut es nicht.

ich ein JSFiddle erstellt habe, das Problem http://jsfiddle.net/flavrjosh/uXzTV/

Dies ist Teil eines größeren Problems Ich versuche, debug zu zeigen, wo IE9 die Ereignisse nicht feuert, nachdem die Seite (funktioniert erstes Mal aktualisiert wird, aber beim Refresh - F5 oder die Refresh-Taste passiert nichts.

Jede Hilfe/Beratung würde

+0

Frage nur, warum willst du das tun? – maxisam

+0

Grundsätzlich enthält App.run() eine Logik, die überprüft, ob ein Benutzer angemeldet ist. Er löst ein Ereignis aus, nachdem das Service-Versprechen-Objekt die Benutzerinformationen zur Überprüfung der Anmeldung zurückgegeben hat. Andere Controller können das vom Login verifizierte Ereignis anhören und auf dieses reagieren. –

+0

Warum haben Sie keinen Dienst, um dies zu überprüfen und diesen Dienst in jedem von Ihnen gewünschten Controller anzurufen? Beide Wege müssen trotzdem etwas Code in den Controllern hinzufügen. – maxisam

Antwort

21

geschätzt werden Es scheint, dass das Problem durch die Kinder Bereiche verursacht die nicht in der Einrichtung, wenn die $ rootScope. $ Broadcast-Ereignis ausgelöst wird.

aufgelöst ich das Beispiel unter Verwendung von:

App.run(function($rootScope, $timeout){ 
    var text = 'Not So Static Now'; 

    $timeout(function(){ 
     $rootScope.$broadcast('event:staticText', text); 
    }, 100); 
}).$inject = ['$rootScope']; 

und:

App.controller('Ctrl1', function($scope, $rootScope) { 
    $scope.staticText = "Static Text"; 

    var things = [ 
     'AngularJS', 
     'StackOverflow', 
     'JSFiddle' 
    ]; 

    $scope.$emit('event:things', things); 

    $scope.$on('event:staticText', function(e, args){ 
     $scope.$apply(function(){ 
      $scope.staticText = args; 
     }); 
    }); 

}).$inject = ['$scope', '$rootScope']; 

die here

Nicht sicher, ob dies die beste Lösung ist zu sehen ist, aber es funktioniert.

+0

Sie sollten den Provider '$ timeout' verwenden, da dieser tatsächlich bis zum nächsten Digest-Zyklus wartet, bevor die Callback-Funktion ausgeführt wird. Sie müssen nicht einmal die Millisekunden einstellen. – Soviut

+0

Yeh, ich habe das Beispiel aktualisiert, um dies zu zeigen. –

+2

Fügen Sie den '$ Timeout' Provider der Sendung hinzu, tat es für mich! – Jaans

Verwandte Themen