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

时间:2014-07-21 21:12:52

标签: javascript angularjs angular-resource

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

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

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中的其他方法。如果我有一个stuffServicestuff的非CRUD方法,另一个crudStuffService基本上是$ resource的包装器,这可能会更好。我真的更喜欢在同一服务下拥有与stuff相关的任何内容。当我之前这样做时,将诸如stuffService.getStuff()之类的内容抽象出来以制作http请求或stuffService.findStuffWithSpecialConditions()以对存储/共享数据执行循环和条件等非常有帮助。

那么,任何人都对如何在同一服务中使用$ resource获取和存储数据有任何想法?这是怎么做的?我错过了什么吗?

谢谢!

1 个答案:

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