2016-09-07 39 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