【问题标题】:Saving data from 'GET' request for other controllers to use?从“GET”请求中保存数据以供其他控制器使用?
【发布时间】:2016-01-06 17:07:18
【问题描述】:

我在用户登录后使用工厂获取 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;

}]);

【问题讨论】:

标签: angularjs


【解决方案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 作为建议的 cmets 之一。

【讨论】:

  • 没问题。不过请记住注意事项。人们经常刷新屏幕,您不希望他们丢失用户数据并使用损坏的应用程序。本地存储或 $cacheFactory 会是更好的方法。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2018-01-06
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多