7

私はバックボーンモデルを持っています:

var User = Backbone.Model.extend({
  idAttribute: '_id',

  url: '/api/user',

  defaults:
    { username: ''
    }
});

私はそれを取得します:

var user = new User();

user.fetch();

さて、click私の見解の1つのイベントとして、私はこれを持っています:

toggleSubscription: function () {
  user.set('subscriptions', true);
  user.save();
}

これにより、POST 要求が発生します。ただし、レコードはサーバー上に既に存在し、それをフェッチした (そしてモデル インスタンスにidプロパティがある) ため、Backbone は POST ではなく PUT を実行する必要があると考えました。代わりに POST を実行しているのはなぜですか?

4

5 に答える 5

7

チェックしてみてくださいuser.isNew()

IDを持たない新しいモデルを作成したようです。そのため、中に追加しようとしていBackbone.syncます。

アップデート:

上記は正確に真実です。これはPOST、新しいモデルであるためです(つまり、IDがありません)。モデルをフェッチする前に、モデルにIDを指定する必要があります。あなたの例では:

var user = new User();
user.fetch();
user.save(); // in XHR console you see POST

var user = new User({ id: 123 });
user.fetch();
user.save(); // in XHR console you see PUT
于 2012-07-20T21:37:44.667 に答える
4

モデルがまだ ID を持っていない場合、それは新しいと見なされます。-- http://backbonejs.org/#Model-isNew

モデルがまだ ID を持っていない場合、それは新しいと見なされます...そして、バックボーンPUTPOST.

この動作はtype: 'POST'、保存ブロックに追加するだけでオーバーライドできます。

var fooModel = new Backbone.Model({ id: 1});

fooModel.save(null, {
  type: 'POST'
});
于 2014-07-23T16:30:18.610 に答える
2

urlRoot プロパティを使用してベース URL を設定します/api/user。それで

  1. プロパティが設定され/api/userていないモデルを保存すると POST し、_id
  2. プロパティが設定され/api/user/{_id}たモデルを保存すると、PUT されます。ベース URL に値が_id自動的に追加されることに注意してください。_id

_idプロパティの値を に設定しているため、プロパティの値を探しますidAttribute

于 2016-01-07T12:33:24.260 に答える
1

サーバーの応答は次のようにする必要があります。

{
  _id : 111
}

主キーとして_idを設定したためです。モデルをフェッチするときは、_idの値を確認してください。次の値が必要です。console.log(model.get('_ id'));

私の考えでは、バックボーンモデル「_id」を主キーとして設定しましたが、サービスは「id」を返します

更新:通常の動作のサンプルコードを追加します:

var UserModel = Backbone.Model.extend({
  idAttribute: '_id',

  url: '/api/user',

  defaults:
    { username: ''
    }
});
user = new UserModel({_id : 20});
user.save();
user = new UserModel();
user.save();

出力:PUT / api / user 405(メソッドは許可されていません)POST / api / user 404(見つかりません)

モデルの最初のインスタンスにIDがあり、PUTを実行しようとしますが、他のPOSTを実行しようとしていることを確認します。問題を再現できないので、問題はサーバーの応答にあると思います。

于 2012-07-20T22:39:47.687 に答える
0

多分本当かどうかを確認する価値があるかもしれませんemulateHTTP。これにより、ヘッダーが追加されたすべての PUT が POST に変更されます_method(アイデアを確認するために、これが存在することを確認することもできます)。

于 2012-11-02T10:13:18.670 に答える