AngularJS 控制器未由工厂更新

AngularJS controller not updated by factory

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

如果你在这个服务(顺便说一句,不是工厂)和这些控制器的代码中放置一些断点,你会看到控制器初始化也发生了'early',这意味着您还没有正确的服务状态。

这是因为依赖注入机制。

您的控制器只会启动一次状态。如果你想更新它的状态,你必须将相关代码放在 refresh() 函数中,并以某种方式在你的服务准备好时调用它。

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

查看您的代码,这里有一些关于如何完成的建议:

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

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

    创建重定向拦截器。

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

简洁明了:)

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