【问题标题】:How to query all of something using $resource in AngularJS如何在 AngularJS 中使用 $resource 查询所有内容
【发布时间】:2013-04-16 16:41:32
【问题描述】:

我不相信我了解如何正确使用 Angular 的服务。我正在使用 JAX-RS 服务器端。

如果服务应该像这样工作(取自phonecat example)...

angular.module('workstation.services', ['ngResource']).
    factory('WorkflowService', function($resource, apiUrl){
        return $resource(apiUrl+'/api/workflow/:uuid', {uuid:'@uuid'}, {});
    });

那么如何查询所有工作流?我不能使用WorkflowService 来实现这一点,因为它已经尝试过/api/workflow/:uuid。我需要另一个基于另一个 URL 的服务。

这好像不是很灵活,除非我用错了。

我习惯于看到Service 处理所有数据查询,并使用WorkflowService.getActiveWorkflows() 之类的方法返回Workflow[]

但是我不确定如何组织此服务,因为我仍然希望拥有与单个实体交互的方法,例如 WorkflowService.save(workflow);$resources 是如何设计为围绕特定 RESTful URL 的,因此很难正确构建它...

【问题讨论】:

标签: javascript rest angularjs jax-rs


【解决方案1】:

检查angular documentation from $resource,阅读actions 参数。它支持定义一个 url,该 url 将覆盖特定操作的基本 url。

使用默认操作“queryAll”,您可以从资源中查询所有内容

例子:

angular.module('workstation.services', ['ngResource']).
factory('WorkflowService', function($resource, apiUrl){
    return $resource(apiUrl+'/api/workflow/:uuid', {uuid:'@uuid'}, {
        queryAll: {
            url: apiUrl + '/api/workflow/getAllActive',
            method: 'GET',
            cache: false,
            isArray: true
        }
    });
});

【讨论】:

    【解决方案2】:

    我最终得到了这个解决方案......

    这使我可以在服务中构建我想要的任何解决方案,同时仍然可以访问可用资源。

    'use strict';
    
    /* Services */
    
    angular.module('workstation.services', ['ngResource']).
        service('WorkflowService', function ($resource, $http, apiUrl) {
            var service = new BaseService($resource(apiUrl+'/api/workflow/:uuid', {uuid:'@uuid'}, {}));
    
            /* Get all available workflows */
            service.getWorkflows = function () {
                return $http.get(apiUrl+'/api/workflow/getAllActive').then(function (response) { return response.data });
            }
    
            return service;
        });
    
    /* Base service */
    function BaseService(resource) {
        this.resource = resource
    };
    BaseService.prototype.getResource = function () { return this.resource }
    BaseService.prototype.newResourceInstance = function () { return new this.resource }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多