2

Angular $resource の非常に奇妙な動作を見つけました。次のコード行をチェックアウトしてください。

    class Service
        constructor: ($resource) ->
            service = $resource '/record/:id'

            Service::list = (cb) ->
                service.query().$promise.then (data) ->
                    #result: data == [e, $promise: Object, $resolved: true]
                    cb data

            Service::get = (id, cb) ->
                service.get(id:id).$promise.then (data) ->
                    #result: data == {id: 1, name: 'name' ...}
                    cb format data

サービスの「get」メソッドはサーバーから送信された正しい値 (オブジェクト) を返しますが、「list」メソッドは結果として $promise と $resolved を含む配列を返します...

誰かが論理的な説明を持っていますか?

アップデート:

問題が見つかりました。サービスの結果は文字列の配列であり、結果として文字列の配列が発生します。これは、$resource の代わりに $http を使用することで解決できます。

元:

サーバー側 -> ['list', 'of', 'elements']

クライアント側 -> ['l','i','s','t']

4

3 に答える 3

5

私のように、追加の $promise および $resolved 属性なしでデータを提供する応答が必要な場合は、リソースを変更して、ここで説明されているように「インターセプター」を追加できます: http://docs.angularjs.org/guide/ migration#resource-promises-are-resolved-with-the-resource-instance

get の場合、次のようになります。

var Resource = $resource('/url', {}, {
  get: {
    method: 'get',
    interceptor: {
      response: function(response) {
        // expose response
        return response;
      }
    }
  }
});

これにより、get 要求を行うときに、リソース インスタンスではなく応答オブジェクトにアクセスできます。例えば:

Resource.get(function(response){
    angular.forEach(response.data, function(value, key){

    }, $scope.varName);
});

response.statusこれは、などの他の応答属性にアクセスできることresponse.headers、および を使用してリソースのインスタンスを取得できることも意味しますresponse.resource

于 2014-04-02T09:58:42.190 に答える
2

しかし、結果としての「リスト」メソッドは、$promise と $resolved を含む配列を返します

これを再確認してくださいconsole.log。配列に余分なプロパティがある場合に Chrome が配列を 内に表示する方法は誤解を招くものです。たとえば、Chrome コンソールで次のことを試してください。

> a = [1, 2, 3]

> a.$promise = 'thing'

> a.$resolved = true

> a
  [1, 2, 3]

> console.log(a)
  [1, 2, 3, $promise: "thing", $resolved: true]

ご覧のとおり、実際は配列に含まれていませんが、配列の要素としてリストされてい$promiseます。$resolved

于 2013-09-02T16:19:50.223 に答える
0

ドキュメント自体は、これとその使用法について言及しています

Resource インスタンスとコレクションには、次の追加のプロパティがあります。

$promise: このインスタンスまたはコレクションを作成した元のサーバー インタラクションの約束。

成功すると、promise は同じリソース インスタンスまたはコレクション オブジェクトで解決され、サーバーからのデータで更新されます。これにより、$routeProvider.when() の resolve セクションで簡単に使用して、リソースが読み込まれるまでビューのレンダリングを延期できます。

失敗すると、promise はリソース プロパティなしで http 応答オブジェクトで解決されます。

$resolved: 最初のサーバーとの対話が (成功または拒否のいずれかで) 完了した後は true、それ以前は false。リソースが解決されているかどうかを知ることは、データ バインディングに役立ちます。

于 2013-09-02T15:44:25.690 に答える