2016-11-04 62 views
0

我有两个角度js的控制器。与视图同步本地存储授权令牌状态

  • NavCtrl控制导航栏,并显示在需要注销按钮
  • AuthCtrl负责认证和设置本地存储

,我现在面临的问题是一切工作正常设置令牌并在两个控制器中检索相同的令牌。

但是,当我进行身份验证时,我需要重新加载页面以查看NavCtrl中的更改,因为它在页面呈现时取值。有什么办法可以将通知传递给NavCtrl:loginlogout请求相应地呈现更改?

.controller 'AuthCtrl',($scope,User)-> 
    $scope.login =()-> 
     User.auth $scope.username,$scope.password 
     return 
    return 

.controller 'NavCtrl',($scope,User,$window)-> 
    $scope.is_authenticated = $window.localStorage.getItem "authFlag" 
    console.log $window.localStorage.getItem "token" 
    console.log $window.localStorage.getItem "authFlag" 
    $scope.logout =()-> 
     User.logout() 
     $scope.is_authenticated = $window.localStorage.getItem "authFlag" 
    return 

User是工厂,我所定义和authFlagbool存储在auth状态。基本上我想听听authFlag

此外,如果可能请评论,如果这是最佳做法或我做错了。

回答

0

这个问题可以通过添加一个简单的brodcast来解决。里面的用户工厂,认证情况,添加

$rootScope.$broadcast 'authEvt'

navCtrl捕获广播使用

$rootScope.$on "authEvt",()-> $scope.is_authenticated = $window.localStorage.getItem "authFlag" return

这将重新加载localStorage的变化事件的变量。

+0

我认为你应该使用路由器来切换用于每种情况的视图(/ login和/ main - after/login)。导航栏只能在/登录后立即加载 –

+0

@VuQuyet导航栏是相同的模板仪表板和登录页面。我也尝试过使用$ location.path,但即使这样做不起作用,我得到一个顶部带有登录按钮的仪表板。只有当我重新加载应用程序,我得到注销按钮。我在网上找到的最佳方式是使用活动:) – georoot