2017-01-25 5 views
1

Ich würde Variable in Controller, die für Navbar verwenden, neu laden.AngularJS Reload Controller Variable

Ich habe Controller für jede Ansicht. Ich benutze einen Controller, loginCtrl, um mich anzumelden, nachdem ich mich angemeldet habe, ich würde die var-set in "rootController" neu laden.

Ich benutze eine Variable für NG-If, um die Schaltfläche Anmelden und Abmelden in Navbar zu wechseln, aber diese Variable (in RootController) wird eine Factory-Funktion aufrufen.

Das Problem ist, dass Variable einmal gesetzt ist nicht ändern, wenn ich Wert der Fabrik ändern. Die Lösung ist nur rootController neu zu laden, um var zurückzusetzen, suche im Internet nach $ route.reload(). Ich habe eine Funktion in rootController erstellen und ich verwende es so:

$rootScope.reload = function(){ $timeout(function() { 
              $route.reload(); 
              }, 0); 
           }; 

, aber wenn ich in einem anderen Controller rufen Sie die App lädt die Unendlichkeit.

Wie lösen Sie es?

EDIT:

angular.module('appModule',[]) 
.controller('AppCtrl',function ($scope,$rootScope,UserLogged){ 
     $scope.isLogged = UserLogged.isLogged(); 
     $scope.user = UserLogged.get(); 
}); 
.config(...) // To configure route, one route have loginCtrl as controller 

.controller('loginCtrl',function($scope,$http,UserLogged){ 
    $http.get(..).sucess(function(data){UserLogged.set(data)}) 
         // call a WS to setup the factory UserLogged  
) 

.factory('UserLogged',function(){ 
var userLogged 
var isLogged 
// set and get method 
} 

Alle Arbeiten in Ordnung, aber wenn ich die isLogged var in der Fabrik aktualisieren die App nicht aktualisiert $ in AppCtrl scope.isLogged. Die Lösung lädt AppCtrl neu, um UserLogged.get() aufzurufen und $ scope.isLogged mit dem neuen Wert zurückzusetzen.

GELöST:

@ rtvalluri Dank

// App control 
$scope.$on('loginLogout',function(){ 
    $scope.isLogged = UserLogged.isLogged(); 
    $scope.userLogged = UserLogged.get(); 
}); 

// loginCtrl 
$http.get(..).sucess(function(data){ 
            UserLogged.set(data); 
            $scope.$emit('loginLogout'); 
            }) 
+0

Können Sie die Code-Form loginCtrl verwenden, um die Variable in der Fabrik zu setzen, post den vollständigen Fabrikcode und Post wie Die rootCtrl verwendet die Variable ab Werk? – GPicazo

+0

So emittiert das Ereignis gelöst Ihr Problem endlich;) Prost .. :) @ Fabrizio – rtvalluri

Antwort

1

Sie können für die Anmeldung und Abmeldung Emittieren zwei Ereignisse versuchen, mit dem Sie Variable in rootController aktualisieren können, ohne es

In Ihrem navbar erfrischenden

<button ng-if="!isLoggedIn">Login</button> 
<button ng-if="isLoggedIn">Logout</button> 

Wenn mainController die rootCont ist Rollen- und Anmelde- und Abmelde die beiden unterschiedlichen Funktionen in zwei verschiedenen Controllern sind,

dann in rootController halten hören mit:

$scope.$on('login',function(event,data){ 
    //assume 'isLoggedIn' is the boolean value 
    $scope.isLoggedIn = data; 
}); 

$scope.$on('logout',function(event,data){ 
    $scope.isLoggedIn = data; 
}); 

Versuchen Emittieren 'Login' Ereignis von Login-Controller-

//on successful login, trigger below event 
$scope.$emit('login',true); 

und in Logout Controller

//on successful logout, trigger below event 
$scope.$emit('logout',false); 

Hinweis: Näherungsweise funktioniert nur, wenn mainController der übergeordnete Controller für andere Controller ist, andernfalls versuchen Sie, Ereignisse auf $ rootScope anstelle von $ scope auszugeben

Verwandte Themen