2012-10-30 19 views
33

mio servizio deve usare una stringa di query a causa di limitazioni sul server che esegue ASP classico:

angular 
    .module('myServices', ['ng', 'ngResource']) 
    .factory('Item', ['$resource', 
    function ($resource) { 
     return $resource('/api/?p=item/:id'); 
    }]); 

e voglio aggiungere parametri di stringa di query in più ad esso:

Item.query({test: 123}, on_success, on_error); 

ma l'URL risultante è

/api/?p=item?test=123 

a quanto pare c'è un bug, ma come ottenere intorno ad esso?

EDIT: presentato questo a https://github.com/angular/angular.js/issues/1511

+0

perché usi {test: 123} invece di {id: 123}? – conradfr

+0

questo è per verificare come i parametri che non sono specificati nella risorsa funzionano. tutto ciò che non è dichiarato nella firma finisce nella stringa di query. – akonsu

+0

Ok Ho letto male la tua richiesta iniziale ma ora non vedo perché è un bug? – conradfr

risposta

68

È possibile utilizzare i parametri di risorse. Se non sono stati specificati segnaposti nel percorso, questi verranno automaticamente convertiti in parametri stringa di query. Come quella:

angular 
    .module('myServices', ['ng', 'ngResource']) 
    .factory('Item', [ 
     '$resource', 
     function ($resource) { 
      return $resource('/api'); 
    }]); 

Item.query({p: 'item/1'}); 

Questo si tradurrebbe in una richiesta di /api?p=item/1.

P.S.

Suppongo che tu lo sappia già, ma non ti piace. Ma continuo a pensare che questo sia il modo corretto nel tuo caso. Considerando la cattiva progettazione dell'API che hai a che fare con quel back-end, potresti avvolgere le risorse AngularJS con un altro servizio che fa questo per te.

+3

Un buon esempio, vorrei che fosse nel tutorial di Angular Tutti i parametri sono codificati nei loro esempi di risorse $ –

+0

Non vedo come questa domanda in realtà ha risposto alla domanda OP. L'OP sapeva già di aggiungere in modo dinamico una query param e di usare una Factory. L'informazione stessa potrebbe essere molto utile, ma non vedo perché è stata effettivamente fornita oltre a quanto già l'OP Ho perso qualcosa nella risposta proposta che ha aggiunto un valore in più? – arcseldon

+0

@arcseldon L'OP ha avuto un problema con due '' 'caratteri punto interrogativo negli URL '' Questo risolve il problema.Esso indica anche che i parametri che non sono definiti come segnaposti nel percorso vai nella stringa di query –

0
var deferred = $q.defer(); 
api.api_name.query({ 
    'param':param_value 
}, 
    function(response) { 
     deferred.resolve(response); 
    }, 
    function(response) { 
     deferred.reject(response); 
    } 
); 
// 
angular 
    .module('module_name') 
    .factory('api',function($resource){ 
     var api_var={}; 
     api_var.api_name = $resource('url?param_key=:param', { 
      param: '@param' 
     }, { 
      'query': { 
       method: 'get' 
      } 
     }); 
     return api_var; 
    }); 
Problemi correlati