62

サーバーからの次の JSON 応答

[
    "hello",
    "world"
]

この ngResource サービスによって 2D 配列に解析されています

myService.factory('Name', function($resource){
    return $resource(site_url+'api/accounts/:accountId/names/', {}, {
        list: {method:'GET', params:{}, isArray:true}
    });
});

そう呼ばれる

$scope.names = Name.list({accountId:$scope.account.id}, function(e){
    console.log(e);
});

へのトレース

[{"0":"h","1":"e","2":"l","3":"l","4":"o"},{"0":"w","1":"o","2":"r","3":"l","4":"d"}]

ヒントはありますか?

4

2 に答える 2

99

TLDR; ngResourceは、応答でオブジェクトまたはオブジェクトの配列を想定しています。


アクションのリストでisArrayが に設定されている場合、 ngResourceモジュールは応答で受信した各アイテムを繰り返し処理し、Resource の新しいインスタンスを作成します。これを行うために、Angular は受け取ったアイテムとクラスの間でディープ コピーを実行し、特別なメソッド (など)を持つオブジェクトを提供します。trueResource$save$delete

ここでソースを確認してください。

内部的に angular はangular.copyを使用してディープ コピーを実行します。この関数はオブジェクト配列でのみ動作します。文字列を渡すと、オブジェクトのように扱われます。

JS の文字列は、各文字への順次アクセスを提供することにより、配列として動作できます。angular.copy文字列を渡すと、次のようになります

angular.copy('hi',{})   => {0:'h', 1:'i'}

各文字はオブジェクトの値になり、そのインデックスがキーとして設定されます。ngResourceは、リソースにプロパティ01.


選択肢は次のとおりです。

低レベルの$httpサービスを使用する

$http.get('/res').success(function(data){
  $scope.test = data;
});

json 応答でオブジェクトの配列を返します

[{'data': "hello"}, {'data': "world"}] 

応答を傍受してデータを変更する

サーバーが送り返すデータを変更できず、ngResourceを使用したい場合は、応答を変換する必要があります。ここでそれを行う方法を読んでください

于 2012-12-11T08:04:11.870 に答える