9

私は AngularJS 1.2.1 の ngResource を使用してnullおり、PUT リクエストのパラメーターの値として送信しようとしています。残念ながら、設定されている場合、Angular はパラメーターを無視し、送信しません。

コード例を次に示します。

var User = $resource('/comments/:id', {id:'@id'}, {
  destroy: { method: 'PUT', params: {content: null} }
});
var user = User.destroy({id:123}, function() {});

代わりに、Angular は無視contentし、キーも null 値も送信しません。

Angularにnullを送信させるにはどうすればよいですか?

4

2 に答える 2

4

Lèse が指摘したように、javascript タイプnullは URL パラメータの有効な値ではありません。

JavaScript のnull値が string と同じではありません'null'。したがって、URL を次のように表示したい場合は/comments/123?content=null、 string を指定するだけ'null'です。URL パラメータは JSONnullではなく、javascript の値は同じ意味ではありませんcontent=null。後者の場合、null は特定のサーバーによって文字列値として解釈されるためです。

サーバーに「値」として送信する標準化された方法がないため、 Angular の $http サービスは、params オブジェクトで null および未定義の値をフィルターしてから URL を作成します。undefined意味がありません。'undefined'ただし、 orのような文字列を送信したい場合は問題ありませんが'null'、サーバー側でそのように解釈するには実装が必要です。

リクエストを作成している場合PUT、データの一部がリソース内で JSON シリアル化され、一部が URL パラメーターを介して送信されるのはなぜですか? サンプル コードの表現が不十分なだけかもしれませんが、その例PUTでは、レスポンス ボディ{"id": 123}と urlを含むリクエストを送信しています/comments/123。それは冗長ではありませんか?contentプロパティとデータを JSON 文字列でサーバーに送信しないのはなぜですか? 次に、JSON 文字列は型の値を表すことができるnullため、探している値が実際に含まれます。また、レコードを削除/破棄している場合、なぜリクエストを使用せず、代わりに PUT リクエストで destroy メソッドをエイリアシングするのでしょうか?nullDELETE

では、なぜこのようなことをしないのですか?それと何のUser関係があるのか​​ わかりません...

var Comment = $resource('/comments/:id', {id: @id}, {
  destroy: {method: 'PUT'}
});
new Comment({id: 123, content: null}).$destroy();
于 2014-08-10T15:34:45.863 に答える
0

私の質問以降に行われたコメントはnull、HTTP パラメータに適切にカプセル化できないため、送信すべきではないことを意味します。ただし、JSON にカプセル化することはできます。null 値を送信する必要があるのはなぜでしょうか。[1] エンドポイントに null を送信upsertすることは破棄を意味するためです。残念ながら、呼び出しで のデフォルトをcontentnull に定義する方法はありません。.destroy()

私が落ち着いた答えは次のとおりです。

var Comment = $resource('/comments/:id', {id:'@id'}, {
  destroy: { method: 'PUT' }
});
var comment = Comment.destroy({id:123, content: null});

これは@jbielickの回答とまったく同じであり、デフォルトのパラメーターとして機能しなかった理由を説明する素晴らしい仕事をしていますが、JSONifyへの入力オブジェクトの一部として提供された場合は機能します.

  1. Upsert は、insert と update という単語を組み合わせたものです。
于 2014-08-11T05:11:57.333 に答える