2015-11-11 80 views
0

我想使用服務從另一個控制器訪問當前用戶變量。這是我的代碼:角度服務變量undefined

服務:

angular.module('app').factory('AuthService', function ($http) { 
    var currentUser; 
}); 

控制器1:

angular.module('app').controller('Signup', function ($scope, AuthService) { 
    AuthService.currentUser = "[email protected]" 
}); 

控制器2:

angular.module('app').controller('Login', function ($scope, AuthService) { 
    $scope.user = AuthService.currentUser; 
}); 

查看:

<body ng-controller="Login" ng-cloak> 
    <button class="btn btn-link navbar-btn pull-right">{{user}}</button> 
</body> 

從Chrome瀏覽器中尋找開發工具,我可以看到,「用戶」是不確定的。有什麼想法嗎?

回答

3

工廠應該返回構成服務的功能或對象。你的工廠定義了一個局部變量,並且不返回任何東西。所以這個服務實際上是未定義的。

它應該是:

angular.module('app').factory('AuthService', function() { 
    return { 
    currentUser: null; 
    } 
}); 
+0

謝謝你的回答。在真實應用程序中(我減少了突出顯示的問題),這對我來說不起作用。我相信這個問題與嵌套範圍有關。換句話說,當我的應用程序查找它時,我不認爲currentUser已經被填充。這裏是我的應用程序的完整代碼,如果你願意這樣看待它。 – CiscoKidx

+0

您的答案與此SO問題結合解決了問題。 http://stackoverflow.com/questions/15380140/service-variable-not-updating-in-controller?rq=1 – CiscoKidx

0

更改服務是如下。發生該問題是因爲有問題的變量不可見。要公開數據,你應該返回一個包含你想要共享的所有方法和變量的對象。請小心!分享變量是一種很好的做法。使用get和set方法。隨着系統的發展,直接影響變量行爲會導致問題。

angular.module('app').factory('AuthService', function ($http) { 
    var currentUser = ""; 
    return { 
     setUser : function(user){ 
      currentUser = user; 
     }, 
     getUser : function(){ 
      return currentUser; 
     } 
    }; 
}); 
+0

介紹這樣的get/set方法將導致多個currentUser對象,我不認爲這是好的。 –

+0

想象一下,無論什麼時候用戶被設置,應該轉向例程以驗證訪問權限。在設置值之前,您需要運行一個方法來執行驗證。如果您直接訪問變量,則有必要在每次調用之前複製驗證例程。我說這不是一種實踐,因爲維護用戶控制的責任應該在服務中。理想和完美的是創建一個模塊部分來控制當前用戶。以AppUserCurrent爲例。 –