使用$resource并在多个控制器之间共享结果的最佳实践是什么?
What is the best practice for using $resource and sharing the results across multiple controllers?
所以,我到处找都找不到我想要的答案。
我最近学到了一些新东西,并从让我的服务像这样获取和存储共享数据转变为:
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
的控制器中引用stuffService.stuff
。但是现在使用$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获取和存储数据有任何想法吗?应该这样做吗?我错过什么了吗?
谢谢!
您正在寻找的是- flyweight模式
其实现中最重要的部分将是:
.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
}
});
- 奇怪的Javascript结果
- Javascript(jQuery)给了我奇怪的结果
- JSONP请求返回结果,但也触发error_callback
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 有条件更新d3.js力图中节点的最佳方法
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- Javascript,输出结果后页面不断刷新
- 这是使用html快照和谷歌获取的预期结果吗?SEO/SPA
- 为react组件传递道具的最佳方式
- Meteor:在模板接受Mongo查询结果之前修改它的最佳实践
- JavaScript/jQuery:格式化日期计算结果的最佳方式
- 是否有用于以最佳间距在行中显示图像搜索结果的 js 库
- 搜索数组并返回结果的最佳方式
- 使用$resource并在多个控制器之间共享结果的最佳实践是什么?
- 将查询结果传递到另一个页面的最佳方式
- 从Q.all压缩结果的最佳方式
- 在MEAN-stack应用程序中,使用测试A的结果作为测试B的输入的最佳方法是什么?
- 在Meteor中等待函数结果的最佳实践
- 在NodeJS中处理多个、顺序的、依赖的mongo查询结果的最佳方式
- 显示SQL结果的最佳方式