所以问题是,我想知道是否可以将应用程序的值存储在某个内容中,因此只需要在加载主应用程序时加载1次。因为现在我有一个控制器,每当我需要用户的某些属性时,控制器就会向数据库发送一个查询。这不是很好吗?
控制器:
(function () {
'use strict';
angular
.module('app')
.controller('UserPropertiesController', UserPropertiesController);
UserPropertiesController.$inject = ['$scope', '$http'];
function UserPropertiesController($scope, $http ) {
$http.get('/user').success(function(data) {
$http.post('/setuser/',data.name).success(function() {
$http.get('/getuser/').success(function(data) {
$scope.userdata = data;
})
})
})
}
})();
这样的一些html页面:
<!-- Testing stuff -->
<div ng-controller="UserPropertiesController" class="container">
<p>The ID is {{userdata.id}}</p>
<p>The email is {{userdata.email}}</p>
</div>
答案 0 :(得分:1)
您有几种不同的存储数据客户端选项。无论您选择哪种方式,您都应该将所有ajax调用放入服务中,这将使维护变得更加容易。
1:使用$ http缓存。这是内置于$http
服务中的简单内存存储。实施后,您将继续像往常一样进行$http
次呼叫,但如果可用,将回复商店中的数据。缺点是它在内存中,因此占用资源,如果用户点击“X”,将会丢失
https://docs.angularjs.org/api/ng/service/ $ HTTP#缓存
2:LocalStorage / SessionStorage 大多数现代浏览器现在都支持LocalStorage和SessionStorage。它的速度相当快,并且具有非常简单的API。它也是同步的,因此实现起来非常简单。缺点是它没有足够的容量,您将数据存储在键值对中,其中数据必须是字符串。因此,您必须先将数据转换为JSON。当用户的会话结束时,会擦除SessionStorage,但是LocalStorage将持续存在,直到用户清除它或您执行代码。 https://developer.mozilla.org/en/docs/Web/API/Window/sessionStorage
3:IndexedDB 大多数现代浏览器都支持这一点,但不如LocalStorage。这是大量客户端数据存储的选择(在我看来)。它本质上是一个完整的客户端数据库。您有集合,事务查询,索引。它是完全异步的。这种能力的缺点是复杂性,它需要分配更多的样板代码来连接和处理数据库版本升级。我过去曾使用过基于浏览器的视频游戏。 https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
4:自己动手 最后,可以选择混合使用这些方法中的任何一种。感谢angular强大的拦截器系统,您可以实现自己的$ http缓存,使用localSotrage或indexedDB,或者在内存中为您提供对缓存的更多控制,然后是默认值。 https://docs.angularjs.org/api/ng/service/ $ HTTP#拦截器
或者您可以将数据存储在您的服务中。
.service('user', function ($http, $q) {
var user;
this.getUser = function () {
if (!user) {
return $http.get('/user')
.then(function (data) {
user = data;
return data;
});
} else {
return $q.when(user);
}
}
});
希望有所帮助,也很容易这是我的第一种写作答案。
答案 1 :(得分:0)
请查看angular localforage. 您可以使用它来存储本地存储中的键/值对。