2013-04-16 8 views
6

Non sono convinto di aver capito come utilizzare correttamente i servizi di Angular. Sto usando un lato server JAX-RS.

Se i servizi sono tenuti a lavorare come (come preso dalla phonecat example) ...

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

E allora come faccio a query per tutti i flussi di lavoro? Non riesco a utilizzare lo WorkflowService per farlo perché è già stato provato a /api/workflow/:uuid. Avrei bisogno di avere un altro servizio che si basa su un altro URL.

Questo non sembra che sia molto flessibile, a meno che non lo stia usando male.

io sono abituato a vedere un manico Service tutta l'esecuzione di query per i dati e hanno metodi come WorkflowService.getActiveWorkflows() per tornare Workflow[]

Tuttavia non sono sicuro di come organizzare questo servizio perché ho ancora voglia di avere metodi che interagiscono con una singola entità, come WorkflowService.save(workflow);. Con quanti $resource s sono progettati per essere intorno ad un URL specifico RESTful è difficile struttura che correttamente ...

+0

Se si chiama il metodo senza passare il: parametro uuid, angolare rimuoverà questo parametro dal vostro URL, che ne so. Hai provato a chiamare il servizio come qui: https://github.com/angular/angular-phonecat/blob/master/app/js/controllers.js –

+1

+1 per il titolo descrittivo (tutto di qualcosa) :) – Zlatko

risposta

0

Ho finito con questa soluzione ...

Questo mi permette di costruire tutto quello che voglio soluzioni nel servizio, pur avendo accesso alla risorsa disponibile.

'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 } 
2

Controllare il angular documentation from $resource, leggere le azioni argomenti. Supporta la definizione di un url che sovrascrive l'url di base per un'azione specifica.

Utilizzando un'azione predefinita 'queryAll' è possibile eseguire una query su di una risorsa qualsiasi.

Esempio:

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