所以,我到处都看了,找不到我想要的答案。
我最近学到了一些新东西,并从我的服务获取和存储共享数据转为:
angular.module('myModule')
.service('stuffService', function(){
var thisService = {
stuff: {},
getSomething: function(){
var onSuccess = function(response){
thisService.stuff = response.data;
};
var onError = function(response){
alert('Doh!');
};
var promise = $http.get(<url>).then(onSuccess, onError);
return promise;
}
};
return thisService;
});
angular.module('myModule')
.controller('myController',function($scope, stuffService){
$scope.stuff = stuffService.stuff;
});
到此:
angular.module('myModule')
.factory('stuffService', function(){
var stuffResource = $resource(<stuff_url>, <params>, <etc>);
return {
stuff: stuffResource
}
});
angular.module('myModule')
.controller('myController', function($scope, stuffService){
$scope.stuff = stuffService.stuff.get(...);
});
就我的应用程序的大部分操作而言,这是一个非常有益的改变;但是,就如何分享stuffResource
返回的数据而言,我正陷入困境。
以前,我总是可以从任何注入stuffService.stuff
的控制器中引用stuffService
。但现在使用$ resource,我不确定如何存储这些数据。使用$scope.stuff
甚至$scope.stuff.get()
始终会运行查询,而不是像“东西”的实际集合那样。
首先,我尝试让父控制器执行$scope.stuff = myService.stuff.get(...)
并且实际上工作得很好......直到我在父控制器之外需要相同的东西。现在我需要找出一种存储数据的方法,这样我就不会在应用程序加载时连续不断地进行相同的API调用。
我已经考虑过打开缓存,这似乎是一种非常直观的(呃!)方法,但我不确定这是否是最好的行动方案。有些数据需要比其他数据更频繁地刷新,因此它必须缓存具有不同大小/长度的缓存限制,并且我担心某些组件将具有与先前加载的组件不同/更新的数据。也许感觉太简单了解决方案,不确定。如果这就是答案那就太好了,我只是使用了`stuffService.stuff.get()',就好像它是旧时代的存储对象一样。
我还考虑过使用拦截器存储这些数据,类似于我之前使用的onSuccess方法。这似乎也可以,但感觉有点脏/ hacky。如果我想要一个好主意,我只需要一点努力就能使这个工作正常。
我最近的想法是创建一种“数据服务”,其中注入了其他服务(如stuffService
)。这个“dataService”将有一个对象,它加载来自所有这些其他服务的数据,然后可以作为dataService.data.stuff
共享。这很好,因为我的数据可以是整个应用程序共享的单个源,但它也是需要注入的另一个服务,因为我可能仍然需要stuffService中的其他方法。如果我有一个stuffService
用stuff
的非CRUD方法,另一个crudStuffService
基本上是$ resource的包装器,这可能会更好。我真的更喜欢在同一服务下拥有与stuff
相关的任何内容。当我之前这样做时,将诸如stuffService.getStuff()之类的内容抽象出来以制作http请求或stuffService.findStuffWithSpecialConditions()以对存储/共享数据执行循环和条件等非常有帮助。
那么,任何人都对如何在同一服务中使用$ resource获取和存储数据有任何想法?这是怎么做的?我错过了什么吗?
谢谢!
答案 0 :(得分:1)
您正在寻找的是 - flyweight patterrn
其实施中最重要的部分是:
.factory('stuffService', function(){
var cache = {};
var stuffResource = function(<stuff_url>, <params>, <etc>) {
if(!cache[<stuff_url>+<params>+<etc>]) {
cache[<stuff_url>+<params>+<etc>] = $resource(<stuff_url>, <params>, <etc>);
}
return cache[<stuff_url>+<params>+<etc>];
}
return {
stuff: stuffResource
}
});