2012-10-30 289 views
33

我的服務必須使用一個查詢字符串由於運行傳統的ASP服務器上的限制:查詢字符串

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

,我想額外的查詢字符串參數添加到它:

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

但得到的URL

/api/?p=item?test=123 

顯然是有缺陷的,但如何解決呢?

編輯:提起這個在https://github.com/angular/angular.js/issues/1511

+0

爲什麼您使用{test:123}而不是{id:123}? – conradfr

+0

這是爲了測試資源中未指定的參數是如何工作的。任何未在簽名中聲明的內容都會在查詢字符串中結束。 – akonsu

+0

好吧,我誤解了你的初始請求,但現在我不明白爲什麼它是一個錯誤? – conradfr

回答

68

可以使用資源參數。如果您尚未在路徑中指定佔位符,則會自動將其轉換爲查詢字符串參數。這樣的:

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

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

這將導致以/api?p=item/1的請求。

P.S.

我想你已經知道了,但你不喜歡它。但我仍然認爲這是你的案子的正確方法。考慮到你正在處理的後端的糟糕的API設計,你可以用另一個服務來包裝AngularJS資源,這個服務可以爲你做到這一點。

+3

好例子,我希望這已經在Angular教程中,所有參數硬編碼在他們的$資源示例中 –

+0

我不明白這個問題實際上回答了OP的問題,OP已經知道動態地添加一個查詢參數,並且使用了一個Factory,這個信息本身可能非常有用,但我不明白爲什麼它實際上提供了超出OP已經寫過。我在提出的答案中錯過了一些增加額外價值的東西嗎? – arcseldon

+0

@arcseldon OP在URL中存在兩個問號字符問題,這解決了問題,並指出未定義的參數作爲路徑中的佔位符進入查詢字符串 –

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