我在用户登录后使用工厂获取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;
}]);
答案 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()上写入服务中的数据。在其他控制器中,您可以读取数据