2013-02-07 3 views
30

Ich versuche, einen kleinen Dienst in meiner eckigen App zu schreiben, der es mir ermöglicht, Konfigurationsparameter auszuwählen, die in globalen Javascript-Objekten spezifiziert sind. Ich möchte nicht versuchen, auf das globale Konfigurationsobjekt zuzugreifen, wenn das Dokument nicht bereit ist (weil ich nicht garantieren kann, in welcher Reihenfolge die Skriptelemente in den HTML-Code eingefügt werden).

Allerdings kann ich nicht verstehen, warum ich den Anruf an $apply für die Auflösung, um tatsächlich auf die then Callback propagieren muss.

myModule.service('GlobalConfigService', ['$q', '$rootScope', function($q, $rootScope) { 
    var def = $q.defer(); 
    $(document).ready(function() { 
     def.resolve(MyConfig.val); 
     $rootScope.$apply(); 
    }); 

    def.promise.then(function() { 
     console.log('I am called only when $apply() is called. Why?'); 
    }); 

    return def.promise; 
}]); 

Antwort

30

In AngularJS werden die Ergebnisse von resolve() asynchron innerhalb eines $ digest-Zyklus nicht sofort weitergegeben. Dies bedeutet, dass Callbacks, die mit then() registriert wurden, erst (später) aufgerufen werden, wenn ein Digest-Zyklus auftritt.

In Ihrem Code verursacht nichts, dass Angular in einen Digest-Zyklus eintritt, daher wird der then() -Rückruf niemals aufgerufen. Das Aufrufen von $ apply() ist eine Möglichkeit, einen Digest-Zyklus auszuführen. Eine andere Möglichkeit: fügen Sie eine Schaltfläche mit ng-Klick, der nichts tut, dann ist das klicken, wird es einen Digest Zyklus verursachen und Sie sollten die Ergebnisse sehen:

<button ng-click="">Force digest by clicking me</button> 

Siehe auch https://stackoverflow.com/a/14657974/215945

Verwandte Themen