javascript - 使用 $resource 并在多个 Controller 之间共享结果的最佳实践是什么?

标签 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 返回的数据,我遇到了一个难题。

以前,我总是可以从注入(inject)了 stuffService 的任何 Controller 引用 stuffService.stuff。但现在有了 $resource,我不确定如何存储这些数据。使用 $scope.stuff 甚至 $scope.stuff.get() 总是会运行查询,而不是像实际的“东西”集合一样。

起初,我尝试让一个父 Controller 执行 $scope.stuff = myService.stuff.get(...) 并且实际上工作得很好...直到我需要它父 Controller 之外的内容相同。现在,我需要找到一种存储该数据的方法,这样我就不会在应用程序加载时不断地重复进行相同的 API 调用。

我考虑过打开缓存,这似乎是一种非常直观的(呃!)方法,但我不确定这是否是最好的做法。某些数据需要比其他数据更频繁地刷新,因此必须使用不同大小/长度的缓存限制进行缓存,并且我担心某些组件将具有与较早加载的组件不同/更新的数据。也许感觉解决方案太简单了,不确定。如果这是答案,那就太好了,我只是使用了“stuffService.stuff.get()”,就像它是过去的存储对象一样。

我还考虑过使用拦截器来存储这些数据,类似于我的 onSuccess 方法之前所做的事情。这看起来也不错,但感觉有点脏/老套。如果我想到了一个好主意,我只需要一点点插入就能让这个工作发挥作用。

我最新的想法是创建一种“数据服务”,将其他服务(例如 stuffService)注入(inject)其中。这个“dataService”将有一个对象,它会加载来自所有其他服务的数据,然后可以作为 dataService.data.stuff 进行共享。这很好,因为我的数据可以是在整个应用程序中共享的单一来源,但它也是另一个需要注入(inject)的服务,因为我可能仍然需要 stuffService 中的其他方法。如果我有一个带有非 CRUD 方法的 stuffService 和另一个 crudStuffService(它基本上是 $resource 的包装器),效果会更好。我真的更希望在同一服务下拥有与 stuff 相关的任何内容。当我以前这样做时,将一些东西抽象出来确实很有帮助,比如 stuffService.getStuff() 来发出 http 请求,或者 stuffService.findStuffWithSpecialConditions() 来对存储/共享数据进行循环和条件等。

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

谢谢!

最佳答案

您正在寻找的是 - 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
    }
});

关于javascript - 使用 $resource 并在多个 Controller 之间共享结果的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874871/

相关文章:

javascript - AngularJS 用函数改变类

javascript - 使用间隔测试 Promise

AngularJS:通过带有数组类型参数(复选框、多选等)的 $resource 发送请求

javascript - Angular http : how to call images with custom headers?

javascript - 有人可以解释这个 fiddle 的输出吗?

javascript - 在 Javascript 行为不稳定的情况下在两个状态之间应用转换

javascript - dojo 小部件在被销毁时会发出事件吗?或者您可以强制它发出事件吗?

javascript - 为什么对象名前需要 "function"关键字?所有对象都是真实的功能?

javascript - AngularJS 指令访问同一范围对象 - 避免覆盖

javascript - AngularJS - 使用 $resource - 为什么我的控制台日志中有这么多条目?