358 Stimmen

Globale Variablen in AngularJS

Ich habe ein Problem, wo ich eine Variable auf dem Umfang in einem Controller initialisiere. Dann wird sie in einem anderen Controller geändert, wenn sich ein Benutzer anmeldet. Diese Variable wird verwendet, um Dinge wie die Navigationsleiste zu steuern und schränkt den Zugriff auf Teile der Website je nach Art des Benutzers, so seine wichtig, dass es seinen Wert hält. Das Problem dabei ist, dass der Controller, der sie initialisiert, von Angular erneut aufgerufen wird und die Variable dann wieder auf ihren ursprünglichen Wert zurücksetzt.

Ich nehme an, dies ist nicht der richtige Weg der Deklaration und Initialisierung von globalen Variablen, gut seine nicht wirklich global, so meine Frage ist, was ist der richtige Weg und gibt es irgendwelche guten Beispiele um, die mit der aktuellen Version von Angular arbeiten?

8voto

Kevin Punkte 4113
localStorage.username = 'blah'

Wenn Sie garantiert einen modernen Browser verwenden. Obwohl Sie wissen, dass Ihre Werte alle in Strings umgewandelt werden.

Außerdem hat es den praktischen Vorteil, dass es zwischen den Ladevorgängen zwischengespeichert wird.

7voto

thank_you Punkte 10671

Bitte korrigieren Sie mich, wenn ich falsch liege, aber wenn Angular 2.0 veröffentlicht wird, glaube ich nicht $rootScope in der Nähe sein wird. Meine Vermutung stützt sich auf die Tatsache, dass $scope wird ebenfalls entfernt. Natürlich wird es weiterhin Controller geben, nur nicht mehr in der ng-controller Denken Sie stattdessen an die Einbindung von Controllern in Direktiven. Da die Veröffentlichung unmittelbar bevorsteht, wird es am besten sein, Dienste als globale Variablen zu verwenden, wenn Sie eine einfachere Zeit, um von Version 1.X zu 2.0 wechseln wollen.

3voto

Megaman Punkte 149

Sie können auch die Umgebungsvariable $window damit eine globale Variable, die außerhalb eines Controllers deklariert wird, innerhalb eines $watch

var initWatch = function($scope,$window){
    $scope.$watch(function(scope) { return $window.globalVar },
        function(newValue) {
            $scope.updateDisplayedVar(newValue);
    });
}

Beachten Sie, dass der Verdauungszyklus bei diesen globalen Werten länger ist, so dass er nicht immer in Echtzeit aktualisiert wird. Ich muss die Digest-Zeit mit dieser Konfiguration untersuchen.

0voto

Black Mamba Punkte 11092

Ich habe gerade aus Versehen eine andere Methode gefunden:

Was ich tat, war die Erklärung einer var db = null obige App-Deklaration und änderte sie dann in der app.js dann, wenn ich es in der controller.js Es könnte einige Probleme mit dieser Methode geben, die mir nicht bekannt sind, aber ich denke, es ist eine gute Lösung.

0voto

Rahul Murari Punkte 399

Versuchen Sie dies, Sie werden nicht gezwungen, zu injizieren $rootScope im Controller.

app.run(function($rootScope) {
    $rootScope.Currency = 'USD';
});

Sie können es nur im Run-Block verwenden, da der Config-Block Ihnen nicht die Möglichkeit gibt, den Dienst von $rootScope zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X