6

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

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

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,因此很难正确地构建它......

4

2 回答 2

2

检查$resource 的角度文档,阅读操作参数。它支持定义一个 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
        }
    });
});
于 2014-09-23T08:57:23.183 回答
0

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

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

'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 }
于 2013-04-16T19:10:30.697 回答