2012-10-30 23 views
33

moja usługa musi użyć ciąg kwerendy z powodu ograniczeń na serwerze, który działa w klasycznym asp:

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

i chcę dodać dodatkowe parametry ciągu kwerendy do niego:

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

ale wynikowy url jest

/api/?p=item?test=123 

widocznie nie jest to błąd, ale jak uzyskać wokół niego?

EDIT: Ten złożony w https://github.com/angular/angular.js/issues/1511

+0

dlaczego używasz {testu: 123} zamiast {id: 123}? – conradfr

+0

służy do testowania parametrów, które nie są określone w działaniu zasobu. wszystko, co nie jest zadeklarowane w podpisie, kończy się ciągiem zapytania. – akonsu

+0

OK Niepoprawnie przeczytałem twoją początkową prośbę, ale teraz nie rozumiem, dlaczego to błąd? – conradfr

Odpowiedz

68

Można użyć parametrów zasobów. Jeśli w ścieżce nie podano elementów zastępczych, zostaną one automatycznie przekształcone w parametry ciągu zapytania. W ten sposób:

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

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

To spowoduje zgłoszenie do /api?p=item/1.

P.S.

Przypuszczam, że już to wiesz, ale ci się nie podoba. Ale nadal uważam, że jest to właściwy sposób w twoim przypadku. Biorąc pod uwagę zły projekt interfejsu API, z którym masz do czynienia, możesz owijać zasoby AngularJS inną usługą, która robi to za ciebie.

+3

Dobry przykład: Żałuję, że nie było to w tutorialu kątowym Wszystkie parametry są zakodowane w ich przykładach zasobów $ –

+0

Nie widzę jak pytanie to rzeczywiście odpowiedziało na pytanie OP: OP wiedział już o dynamicznym dodawaniu paramu zapytań i korzystaniu z fabryki, sama informacja może być bardzo przydatna, ale nie widzę powodu, dla którego została ona faktycznie dostarczona ponad to, co już OP Czy coś pominąłem w proponowanej odpowiedzi, która dodała dodatkową wartość? – arcseldon

+0

@arcseldon OP miał problem z dwoma znakami zapytania "?" w adresach URL, co rozwiązuje problem, jak również wskazuje, że nie zdefiniowano parametrów jako placeholders na ścieżce przejdź do łańcucha zapytania –

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