3

特定の $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 を実行し、シリアル化できないプロパティのシリアル化を防ぐ方法はありますか?

4

2 に答える 2

0

最近、angularjs と codeigniter を使用して同じ問題に遭遇しました。パラメータの定義方法に依存することがわかりました。

var param1 = {'name':'some name'}; 
var param2 = { name :'some name'}; 
$http.post('some url/',$.param(param1),....); // babies die
$http.post('some url/',$.param(param2),....); // nuclear war averted
于 2015-04-24T20:28:49.133 に答える