重新加载一个不在ngRoute管理下的控制器
Reload a controller not managed by ngRoute on route change
我的web应用程序登录过程如下,
。用户单击登录按钮,链接将他们带到http://localhost:3030/login/facebook
b。NodeJS后端接收请求,并使用passport-facebook将浏览器定向到Facebook登录页面。
c。然后Facebook用一些用户数据将用户引导回调。(回调:http://localhost:3030/login/facebook/callback)
d。对于用户数据,存在或将创建一个帐户,并且将创建属于该帐户的令牌(使用JWT)
e。该令牌将通过重定向到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
完成的路由不会重新创建我的NavigationViewController
,使_token
变量设置为先前的状态。
我需要一种方法让NavigationViewController
知道令牌已经更改,因为它不涉及路由
我想给你提两个建议。这里有两个。(1)。您可以将$watch添加到令牌中,以便无论何时更改它都会自动反映。(2)。将令牌分配到rootscope中,并在令牌更改时更新它。
如果你需要的话,我也可以给你一些例子。
问候,Mahendra
看起来您需要在控制器之间传递数据。这里有一种方法。在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;
});
})
最后,使用了一个简单的解决方案——事件。
我的问题的标题表明,我想重新加载一个嵌套的父视图控制器在路由改变。由于嵌套层次结构的父级不是由ngRoute
管理的,因此它不会自动进行管理。然而,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();
}]);
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 如何访问声音管理器2创建的声音对象
- JS编译器/包管理器,用于版本控制
- Firebase2(Firebase.google.com)推送通知-从外部管理
- 以角度管理动态URL
- React Redux错误页面管理
- 让Webpack管理Quirky AMD定义的最佳方式
- 如何在p5.js中管理多智力竞赛游戏的多个屏幕
- JavaScript管理具有重复属性名称的对象属性
- 管理四位数的ID
- 布局中的项目管理
- 角度控制器未使用OcLazyLoad和ngRoute加载
- 如何在具有某些 UI 视图的状态中管理工厂单个请求数据
- ngRoute找不到模板
- jQuery中的状态管理是什么
- CSS更改类样式管理面板
- 如何管理视图的更改
- 如何在词法环境中管理块范围
- 使用2个控制器管理工厂JSON$http数据
- 重新加载一个不在ngRoute管理下的控制器