AngularJS控制器未由工厂更新

时间:2015-01-05 09:55:43

标签: javascript angularjs

我有两个控制器和一个工厂。第一个控制器向服务器发出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'}的东西)。

2 个答案:

答案 0 :(得分:0)

如果你在这个服务(顺便说一下,不是工厂)和这些控制器的代码中加入一些断点,你会看到控制器初始化过早发生,这意味着你不要尚未拥有正确的服务状态。

这是因为依赖注入机制。

你的控制器只启动一次状态。如果要更新其状态,则必须将相关代码放在refresh()函数中,并以某种方式将其调用到服务准备就绪的位置。

有几种方法可以做到这一点,你可以看看这里: http://www.codeproject.com/Tips/773147/Communication-between-the-Controllers-in-AngularJS

答案 1 :(得分:0)

在此处查看您的代码,了解如何完成代码:

  1. $routeProvider与自定义属性一起使用,例如" acl"。使用数值。
  2. 使用:

    app.run(function ($rootScope, $location) {
    
    $rootScope.$on('$routeChangeStart', function (event, nextRoute, currRoute) {
    

    创建重定向拦截器。

  3. ACL属性的数值比较:if (user.acl < route.acl)

  4. 干净简单:)

    顺便说一句。您可以在控制器中使用$ watch来观察工厂的变化并对它们做出反应。