保存来自“GET”请求的数据以供其他控制器使用?

时间:2016-01-06 17:07:19

标签: angularjs

我在用户登录后使用工厂获取JSON数据。如果用户名和密码正确,则应从api链接中提取JSON数据。我的应用程序中有几个控制器需要使用这些数据。我想避免与我的所有控制器共享这个工厂,因为我不想保留“获取”数据。我只希望这个工厂与登录控制器一起使用。

如何从'dummyData'保存数据,然后所有其他控制器都可以使用该数据而无需每次都发出'GET'请求?

angular.module('ciscoImaDashboardApp').factory('dummyData', ['$q', '$http', function($q, $http) {
    var apiServices = {};

    apiServices.saveData = function(user,password) {
        var deferred = $q.defer();

        var req = $http({
            method: 'GET',
            url: 'http://magainteractive.com/prototypes/cisco-ima-dashboard/cms/web/api/login/login/?username='+user+'&password='+password
        });

        req.success(function(response) {
            deferred.resolve(response);
        });

        req.error(function(err) {
            console.log("there was an error: "+err);
            deferred.reject(err);
        });

        return deferred.promise;    
    }

    return apiServices;

}]);

2 个答案:

答案 0 :(得分:1)

在工厂中创建另一个值并存储您获取的数据。然后,您可以使用dummyData.user或类似的东西从任何控制器访问该数据。

关注best practices,您可以执行以下操作:

function userService() {
    var service = {
        user: null,
        authenticateUser: authenticateUser
    };

    return service;

    function authenticateUser() {
        // your GET logic here

        // then set service.user to the successful response data
    };
}

因此,无论您注入userService,您都可以执行userService.user,并且无需进行第二次GET即可获得用户数据。它基本上将存储在当前会话中。例如:

function dashboardController(userService) {
    var vm = this;
    vm.currentUser = userService.user;
}

<强>注意事项

这种方法的问题在于,如果用户刷新,该服务中的数据将会丢失。

您可以利用浏览器工具的强大功能 - 即本地存储。因此,不要将service.user设置为成功的响应数据,而是执行类似localStorage.setItem('user', response.data)的操作,您可以在整个控制器中以localStorage.getItem('user')的形式访问它,这将是一个对象或任何您保存它的对象如。这将允许它在浏览器中被删除或过期,因此即使用户刷新他当前的会话,用户数据仍将存在。这也只需要一个GET请求。

请参阅这些docs for some info on localStorage。适用于所有现代浏览器,适用于IE 8。

您也可以使用$cacheFactory作为建议的评论之一。

答案 1 :(得分:0)

您必须创建一个服务(谁是单身人士)并将其注入您想要访问登录数据的每个位置。 在第一个$ http.get()上写入服务中的数据。在其他控制器中,您可以读取数据