2013-08-19 41 views
9

我想從AngularJS將數組傳遞給我們的API。但是,當發送時,參數會重複發送,而不是作爲數組發送。這裏是我的代碼:

angular.module('sigApp.services', ['ngResource']). 
    // Fetch cases from server 
    service('caseFetcher', ['$resource', function($resource) { 
     this.getCases = function(params) { 
      console.log('params: ',params); 
      return $resource('/v1/cases/', params); 
     }; 
    }]); 

這裏是產生(略)的網址:?/ V1 /件狀態= OPEN &狀態=舉行

這是我想要的網址:/ V1 /件?狀態%5B0%5D = OPEN &狀態%5B1%5D = HELD(?又名狀態[0] = OPEN &狀態1 = HELD)

下面是對於在上面的代碼中記錄的對象的屏幕截圖: enter image description here

我試過了最新版本的angularjs(1.2rc1),並試過了Restangular插件。無論我嘗試什麼,我都會獲得多次傳遞的參數,而不是數組格式。我們的API無法使用同一個密鑰使用多個值。

任何想法?

編輯:當其他問題(AngularJS: ngResource and array of object as params to URL)完全不是這樣的時候,有幾個人已經標記爲重複。另一個問題涉及通過POST發送一個數組,我試圖做一個GET請求(設置爲isArray:默認爲true),我想只傳遞一個數組作爲參數,這個答案似乎並不幫我。那麼有人可以幫助這個嗎?

更新我在下面回答了我自己的問題,但作爲評論,我給任何遇到此問題的人提供更多信息。我們在後端使用Play Framework 2.1。我無法生成最初在上面發佈的編號數組,但是能夠使其僅用於非索引數組,因此這是最終生成的URL:

/v1/cases?status %5B%5D = OPEN &狀態%5B%5D =舉行(又名?狀態[] = OPEN &狀態[] =持有)

希望這有助於別人

+0

這將是更好,如果你也與您正在使用,以便它可以幫助其他用戶服務器端框架標記它。在答案中添加生成的url也是有幫助的。我相信這不會是你最初想要的問題。 – rubish

回答

18

我解決我自己的問題,通過改變如何PARAMS分別設置被傳遞至$資源這一點。相反的:

$scope.params.status = ['OPEN','HELD']; 

我用:

$scope.params["status[]"] = ['OPEN','HELD']; 

這讓我根據需要在服務器上檢索值。

+0

任何方式使它**不** ** URL編碼爲'%5B%5D'?我需要它發送適當的'[]'。 – kspearrin

0

我創造了這一個here一個plunkr 。

你說得對,資源服務不會做你想做的事情..至少我不能接受它。我能夠得到它的工作方式是通過利用$ http服務並使用逗號分隔的值附加到參數'status'構建我的查詢字符串。其結果是在形式的URI:

http://run.plnkr.co/someUrl?status=One,Two,Three

在您的API身邊,你可以解釋逗號分隔的參數作爲索引元素。

代碼的基本構建起來是這樣的:

var statusValues = ["One", "Two", "Three"]; 
var queryParams = "status="; 
for (var i=0;i<statusValues.length;i++){ 
    queryParams += statusValues[i]; 
    if (i != statusValues.length-1){ 
    queryParams += ","; 
    } 
} 
$http.get('/someUrl?' + queryParams).success(successCallback); 
+0

感謝您發佈此信息。雖然它會起作用,但查詢字符串的複雜性會導致很多條件邏輯準備字符串。我自己回答了這個問題;我改變了我分配變量的方式,現在它按需要工作。再次感謝!! –

+0

這很酷,np。我更喜歡你的解決方案:) – BoxerBucks

0

由於某些原因,將變量設置爲'數組'樣式名稱的解決方案對我來說並不適用。這個問題可能是AngularJS 1.0.8。對於那些不能前滾的人來說,這是一個將對象分解成參數的函數。

function queryBuilder(object){ 
    var key; 
    var queryString = '?'; 
    var count=0; 
    for (key in object){ 
     if(count !== 0){ 
      queryString+='&'; 
     } 
     if(object[key] instanceof Array){ 
      var lengthOfObj =object[key].length; 
      for(var i=0;i<lengthOfObj;i++){ 
       if(count !== 0){ 
        queryString+='&'; 
       } 
       queryString += key +'='+object[key][i]; 
       count++; 
      } 
     }else{ 
      queryString += key +'='+object[key]; 
     } 
     count++; 
    } 
    return queryString; 
} 

用法:

var baseInfo = { 
    someGetVar:someGetArray 
} 
var queryString = queryBuilder(baseInfo); 
var url = 'someURL'; 

$http({method:'GET',url:url+queryString}).success(function(data){ 
    //success state 
}).error(function(data){ 
    //Error state 
))