AngularJS Reload控制器变量

时间:2017-01-25 17:32:13

标签: javascript angularjs

我会在用于导航栏的控制器中重新加载变量。

我有每个视图的控制器。我使用控制器loginCtrl登录后,我将重新加载" rootController"中的var set。

我在ng-if中使用变量来切换导航栏中的按钮登录和注销,但是这个变量(在rootController中)正在调用工厂函数。

问题在于,当我改变工厂价值时,设置变量一次不会改变。解决方案是重新加载rootController以重置var,搜索到互联网我发现$ route.reload()。 我在rootController中创建了一个函数,我使用它:

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

但是当我在其他控制器中调用时,应用程序会加载无穷大。

如何解决?

编辑:

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
}

一切正常,但是当我在工厂更新isLogged var时,app不会在AppCtrl中更新$ scope.isLogged。解决方案是重新加载AppCtrl以调用UserLogged.get()并使用新值重置$ scope.isLogged。

解决:

@ rtvalluri谢谢

// 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');
                                   })

1 个答案:

答案 0 :(得分:1)

您可以尝试为登录和注销发出两个事件,使用它们可以在rootController中更新变量而不刷新它

在导航栏中

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

如果mainController是rootController,登录和注销是两个不同控制器中的两个不同的函数,

然后继续使用:

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

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

尝试从登录控制器

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

并在Logout Controller中

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

注意:只有当mainController是其他控制器的父控制器时,上述方法才有效,否则尝试在$ rootScope上发出事件而不是$ scope