使用$resource并在多个控制器之间共享结果的最佳实践是什么?

What is the best practice for using $resource and sharing the results across multiple controllers?

本文关键字:最佳 结果 是什么 共享 之间 resource 控制器 使用      更新时间:2023-09-26

所以,我到处找都找不到我想要的答案。

我最近学到了一些新东西,并从让我的服务像这样获取和存储共享数据转变为:

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
    }
});