Angularjs $ resource - 无法将数组作为参数之一传递

时间:2013-08-19 16:31:10

标签: angularjs playframework-2.0

我正在尝试将数组从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);
        };
    }]);

以下是生成的URL(缩写):/ v1 / cases?status = OPEN& status = HELD

以下是我想要的网址:/ v1 /个案情况?状态%5B0%5D = OPEN&amp; status%5B1%5D = HELD(又名?status [0] = OPEN&amp; status 1 = HELD)< / p>

以下是上述代码中记录的对象的屏幕截图: enter image description here

我已经尝试了最新版本的angularjs(1.2rc1)并尝试了Restangular插件。无论我尝试什么,我都会多次传递params,而不是数组格式。我们的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&amp; status%5B%5D = HELD(又名?status [] = OPEN&amp; status [] = HELD)

希望这有助于其他人

3 个答案:

答案 0 :(得分:18)

我通过改变传递给$ resource的params的设置来解决我自己的问题。而不是:

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

我用过:

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

这允许我根据需要检索服务器上的值。

答案 1 :(得分:0)

我为这个here创建了一个plunkr。

你是对的,资源服务不会做你想做的事情。至少我无法做到。我能够让它工作的方式是利用$ http服务并使用附加到param'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);

答案 2 :(得分: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
))
相关问题