2016-09-07 46 views
2

考慮以下幾點:AngularJS:.value的持久性

AngularJS:

angular.module('app', []) 

.value('userData', {}) 

.factory('AuthService', function (userData) { 

    $http.put('/login', { 
    ... 
    }) 

    .then(function onSuccess(res) { 
     userData = res.data.user 
    }) 

}) 

.controller('Dashboard', function (userData) { 
    $scope.user = userData 
}) 

HTML:

<div ng-controller="Dashboard"> {{ user.name }} </div> 

應該userData填充時,是時候爲{{ user.name }}userData應該通過刷新持續嗎?如果目標是顯示從特定於用戶的API接收到的信息,除了將res.data.user存儲到本地存儲器之外,還有什麼其他選項?

+0

可能是這樣的緩存結果$ HTTP({緩存:真,URL: '/登錄',方法: 'POST'}) – Cyril

回答

2

直接賦值像

userData = res.data.user; 

休息JS引用,這意味着任何引用的變量將無法獲得新的價值。

在我看來,更好的選擇是保存在你的工廠的承諾參考

.factory('AuthService', function ($http) { 
    return $http.put('/login', { 
     ... 
    }).then(function (res) { 
     return res.data.user; 
    }); 
}) 

創建你的工廠時,HTTP請求將只運行一次,但承諾將保存對工廠名稱。那麼你的控制器(或其他東西)可以簡單地使用

$scope.user = 'Loading...'; // if you want to show something right away 
AuthService.then(function(userData) { 
    $scope.user = userData; 
}); 
+0

@ TimBiegeleisen更新了我的答案 – Phil

+0

因此,您的方法是在工廠完全運行後才訪問用戶數據,這意味着PUT的回調已完成? –

+0

您可以隨時訪問存儲在AuthService工廠中的promise,但只有在PUT請求完成後纔會使用值解析。一旦有了,任何對'AuthService.then()'的調用將立即解決 – Phil