特定の $resource の読み取り/作成/削除はすべて正常に機能しますが、編集はうまくいきません。
私のアプリ構成には次のものがあります。
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
$httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
これは、POST/PUT の両方で正常に機能しています。言及する価値があるかもしれません。
私の $resource 定義は次のようになります。
app.factory('Project', function($resource) {
return $resource('project/:id',{},{
query: { method: 'GET', isArray: false },
update: { method: 'PUT' }
});
});
次に ProjectEditCtrl で:
var ProjectEditCtrl = function ($scope, $routeParams, Project, $location) {
var id = $routeParams.id;
$scope.projectForm = Project.get({id: id});
$scope.projectDo = function() {
var params = $.param($scope.projectForm);
Project.update({id: id}, params);
}
}
実際に実行する$scope.projectDo()
と、PUT だけでなく、次のスクリーン キャプチャに示されている一連のリクエストが表示されます。
以外の呼び出しがあるのはなぜPUT project/1
ですか? :id
パスにno がないため、DELETE 500 が発生していることに注意してください。
更新:
ふざけて、 $resource 定義全体を次のように変更することにしました。
query: { method: 'GET', isArray: false },
update: { method: 'PUT' },
save: { method: 'GET' },
delete: { method: 'GET' },
get: { method: 'GET' }
Project.delete
この定義を使用してテストすると、追加/削除コントローラーがそれを尊重し、およびに対して GET を使用しようとすることが確認されますProject.save
。
実行Project.update
すると、奇妙な呼び出しが少なくなったようです。以前と同じように:
- ポスト×1
- GET×2
- 削除 x2
- パット×2
update()
GET以外のすべてを強制した後、次のように表示されます。
- いいえポスト
- GET×2
- 削除x1
- パット×2
まだ混乱していますが、おそらく役立つ情報です。
更新 2 :
PUT メソッドを放棄してProject.update()
代わりに POST を使用することにしましたが、多くの不要なリクエストで同様の問題が発生します。
また、これらのリクエストはすべて同じ時点で発生することにも注意してください。つまり、いずれのリクエストも連続したものではなく、別のリクエストの完了に反応するものではありません。
更新 3 :
update
どういうわけか既存のコードを踏みにじっていないかどうかを確認する以外に、別の単語を使用してみましたProject.whaaaat()
が、同じ効果があります。
更新 4 :
さて、真実に少し近づいています。定義されていないメソッドを試しましたが、同じ動作が発生します。認識されていないメソッドを呼び出すと、定義されたすべてのメソッドを単純に起動していると思いますか?
更新 5 :
この問題は、次の 2 行の組み合わせによって引き起こされているようです。
$scope.projectForm = Project.get({id: id});
var params = $.param($scope.projectForm);
$.param
によって返されたオブジェクトで実行すると、実際にはプロパティであるため、Project.get
すべてのメソッドが呼び出されます。Project
projectForm
プロパティのループをリビールで実行するtypeof
:
name は文字列です id は数値です $get は関数です $save は関数です $query は関数です $remove は関数です $delete は関数です $update は関数です
オブジェクトで $.param を実行し、シリアル化できないプロパティのシリアル化を防ぐ方法はありますか?