我会在用于导航栏的控制器中重新加载变量。
我有每个视图的控制器。我使用控制器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');
})
答案 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