在路由改变时重新加载不受ngRoutepipe理的控制器

我的Web应用程序login过程如下,

一个。 用户点击loginbutton,链接将它们带到http:// localhost:3030 / login / facebook

湾 NodeJS后端接收请求,并通过passport-facebook将浏览器导向Facebooklogin页面。

C。 Facebook然后用一些用户数据引导用户回到回叫。 (callback: http:// localhost:3030 / login / facebook / callback )

d。 通过用户数据,存在或将创build一个帐户,并创build一个属于该帐户的令牌(使用JWT)

即 该令牌将通过redirect到http:// localhost:3030 /#/ got_token / the_actual_jwt_string发送给用户

F。 AngularJS应用程序将采用ngRoute的路由,并将该令牌保存在localStorage中。

NodeJS中的令牌问题代码,

server.get('/auth/facebook', passport.authenticate('facebook', {session: false})); server.get('/auth/facebook/callback', passport.authenticate('facebook', {session: false}), function(req, res) { var token = jwt.sign(/* issue a token */); // put the token into database res.header('Location', 'http://localhost:3030/#/got_token/' + token); res.send(302); }); 

AngularJS中的路由代码,

 .when('/got_token/:token*', { redirectTo: function(parameters, path, search) { localStorage.setItem('ngStorage-token', JSON.stringify({ token: parameters.token })); return '/'; } }) 

这很好,直到我的视图层次结构看起来像这样,

 <body ng-controller="NavigationViewController"> <div ng-view> </div> </body> 

而控制器的代码,

 controllers.controller('NavigationViewController', ['$scope', '$route', 'token', function($scope, $route, token) { var _token = token.retrieve(); $scope.token = _token; $scope.authenticated = (_token != ''); if ($scope.authenticated) { var payload_string = b64utos(_token.split('.')[1]); var payload = KJUR.jws.JWS.readSafeJSONString(payload_string); $scope.displayName = payload.facebookDisplayName; } else { $scope.displayName = 'no'; } $scope.logout = function() { token.clear(); }; }]); 

ngRoute完成的路由不会重新创build我的NavigationViewController ,将_tokenvariables设置为之前的状态。

我需要一种方法让NavigationViewController知道该标记已经改变,因为它不涉及路由。

       

网上收集的解决方案 "在路由改变时重新加载不受ngRoutepipe理的控制器"

想给你们两个想法,这是这两个。 (1.)您可以将$ watch添加到令牌中,以便每当它被更改时自动反映。 (2.)将令牌分配到rootcope,并在令牌被更改时更新它。

如果你需要的话,我也想给你们举个例子。

问候,马亨德拉

看起来你需要在控制器之间传递数据。 这是你可以做的一个方法。 在您的NavigationViewController监听事件以进行changed并在发生更改时emit事件。 将它绑定在rootScope

 angular.module('app', []) .controller('LoginCtrl', function ($scope, $rootScope) { $scope.changeToken = function () { $rootScope.$emit('changed', +new Date()); } }) .controller('NavigationViewController', function ($scope, $rootScope) { $scope.token = null; $rootScope.$on('changed', function(event, token) { $scope.token = token; }); }) 

最后,使用一个简单的解决scheme – 事件。

正如我的问题的标题所示,我想在路由更改上重新加载嵌套的父视图控制器。 由于嵌套层次结构的父级不受ngRoutepipe理,因此不会自动执行。 但是, ngRoute有一个服务( $route )来发送事件,这是最简单的答案。

基本上,我把所有的初始化代码放到一个函数中,然后在事件上调用这个函数。

 controllers.controller('NavigationViewController', ['$scope', '$route', '$location', 'token', function($scope, $route, $location, token) { var updateNavigationBar = function() { var _token = token.retrieve(); $scope.token = _token; $scope.authenticated = (_token != ''); if ($scope.authenticated) { var payload_string = b64utos(_token.split('.')[1]); var payload = KJUR.jws.JWS.readSafeJSONString(payload_string); $scope.displayName = payload.facebookDisplayName; } else { $scope.displayName = 'no'; } }; $scope.$on('$routeChangeSuccess', function(event, current, previous) { if ($location.path() == '/events') { updateNavigationBar(); } }); updateNavigationBar(); }]);