2

次のように定義されたデフォルトのngResourceがあります。

var Posts = $resource('/posts/');

そして、nodejsサーバーから次のようなブログ投稿を1つ取得した後:

$scope.post = Posts.get({_id:query._id});

ユーザーがそれにいくつかの変更を加えてから、私は次のように呼び出します。

$scope.post.$save();

サーバーが応答コード200を返した後、私の$scope.postは次のようになります。

g {0: "O", 1: "K", $get: function, $save: function, $query: function, $remove: function, $delete: function}

なんで?何か理由はありますか?文字「O」と「K」は、操作が成功し、応答200を返したことを意味する必要がありますか?独自のsaveメソッドを最初から作成せずに、この動作を変更できますか?

4

1 に答える 1

8

リソース($ get、$ saveなど)のInstanceメソッドを使用すると、この場合、サーバーから返されたものでインスタンス($ scope.post)が更新されます。

しかし、ここでの問題はそれよりも少し大きいと思います。$ resource定義は、URL構成にないため、.get()メソッドのIDプロパティには何もしません。したがって、「/ posts」リソースに移動したため、サーバーは投稿の配列を返した可能性があります。$ save()メソッドを実行すると、Angularは配列から開始したため、「OK」に戻った文字列を取得し、それらの文字と一致するように$scope.postにアイテムを作成します。

変更する必要があるものは次のとおりです。

var Posts = $resource('/posts/:_id');

それで:

$scope.post = Posts.get({_id: query._id});

今、あなたは呼び出すことができます:

$scope.post.$save();

これに関する唯一の問題は、サーバーが本文で「OK」を返す場合、$scope.postが返されたデータで吹き飛ばされることです。これを修正するためのオプションは次のとおりです。

  1. サーバーからステータスコードのみを返し、本文は返しません。RESTful APIの場合は204になると思います。つまり、クライアント側のバージョンは更新する必要がありません。

  2. クライアント側のバージョンで更新が必要な場合(サーバーで生成された新しいタイムスタンプなど)、200を返し、更新されたPostオブジェクトの全体を返します。

  3. 上記の調整ができない場合は、インスタンスメソッドではなくサービスレベルメソッドを使用してください。

    Posts.save({_ id:query._id}、post);

于 2013-03-04T00:24:26.087 に答える