簡體   English   中英

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'}東西)。

如果您在此服務的代碼(順便說一下,不是工廠)中設置了一些斷點,則您將看到控制器的初始化發生得太早了,這意味着您還沒有針對該服務的正確狀態。

這是因為依賴項注入機制。

您的控制器僅初始化一次狀態。 如果要更新其狀態,則必須將相關代碼放入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)

干凈簡單:)

BTW。 您可以在控制器中使用$ watch來觀察工廠中的變化並對它們做出反應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM