我有两个控制器和一个工厂。第一个控制器向服务器发出http请求,并返回一个写入工厂的字符串。然后应该用新字符串更新第二个控制器,这不会发生。
相关代码:
...
.factory('user', function() {
return {
name: {str: ''},
passwordHashed: {str: ''},
userType: {str: 'none'},
};
})
.controller('nav', ['$scope', 'user', function($scope, user) {
$scope.allSites = [
//example what a page looks like, i have several more pages and several more usertypes
{name: 'home', title: 'Home', allowed: ['none', 'admin']},
];
$scope.allowedSites = []; //displayed in navigation
angular.forEach($scope.allSites, function(site) {
if(contains(site.allowed, user.userType.str) != -1) $scope.allowedSites.push(site);
});
}])
.controller('loginCTRL', ['$scope', '$http', 'user', function($scope, $http, user) {
$http.get('url').success(function(data) {
//some code
user.name.str = $scope.enteredUsername;
user.passwordHashed.str = $scope.passwordHashed;
user.userType.str = data; //admin
});
});
这应该在每次userType更改时重新生成导航,但在登录后,例如没有任何反应。我已经四处搜索过,有些帖子说,你应该将字符串放入单独的对象中,但这并没有解决任何问题。我仍然保留它(所有这些{str: 'bla'}
的东西)。
答案 0 :(得分:0)
如果你在这个服务(顺便说一下,不是工厂)和这些控制器的代码中加入一些断点,你会看到控制器初始化过早发生,这意味着你不要尚未拥有正确的服务状态。
这是因为依赖注入机制。
你的控制器只启动一次状态。如果要更新其状态,则必须将相关代码放在refresh()函数中,并以某种方式将其调用到服务准备就绪的位置。
有几种方法可以做到这一点,你可以看看这里: http://www.codeproject.com/Tips/773147/Communication-between-the-Controllers-in-AngularJS
答案 1 :(得分:0)
在此处查看您的代码,了解如何完成代码:
$routeProvider
与自定义属性一起使用,例如" acl"。使用数值。使用:
app.run(function ($rootScope, $location) {
$rootScope.$on('$routeChangeStart', function (event, nextRoute, currRoute) {
创建重定向拦截器。
ACL属性的数值比较:if (user.acl < route.acl)
干净简单:)
顺便说一句。您可以在控制器中使用$ watch来观察工厂的变化并对它们做出反应。