model.save()で成功コールバックをトリガーするにはどうすればよいですか?


106
this.model.save({
  success: function(model, response){
    console.log('success');
  },
  error: function(){
    console.log('error');
  }
})

モデルは保存を処理するサーバーに正しく送信されますが、成功コールバックは発生しません。サーバーから何かを送り返す必要がありますか?


7
私はそれを間違っていたことがわかりました:正しい構文は次のとおりです:this.model.save(newItem、{success:...、error:...})
Running Turtle

8
'null'は、プレースホルダーとしても機能するようです。
UpTheCreek、2011

@UpTheCreekありがとう。それは役に立ちました。ソースを見て、キーと値として空の文字列を渡しました。しかし、あなたの方法のように。
Pramod、2012

@UpTheCreek nullは何らかの理由で機能しませんでしたが、空のattr objを渡すと動作しました:)
KoalaKid

回答:


123

saveの最初の引数は、モデルに保存する属性です:

this.model.save( {att1 : "value"}, {success :handler1, error: handler2});

9
私は少し混乱しています-(1)バックボーンは常に保存中にモデル全体を送り返したと思いました(部分的なモデル更新を送ることは不可能です)。それでは、属性の名前と値の目的は何ですか?(2)いくつかの.set()sを実行した後にモデルを保存したいだけの場合-属性リストの理由 (3)ドキュメントでは、属性リストparamはオプションとして示されています。明確にできますか?ありがとう。
UpTheCreek、2011

7
属性を使用して一連の「設定」を行い、属性なしで保存を行うことができます。モデルのすべての属性は常にサーバーに送信されます。属性付きで保存は、set + saveへのショートカットにすぎません。
ジュリアン

5
ばかげているように思えますが、これはまさにそのとおりです。残念ながら、文書化が不十分です。
ケビン

51
私のテストでは、「attributes」パラメーターに何かを渡さないと、成功とエラーのコールバックが発生しないようです。これはドキュメントと矛盾しているようです... model.save([attributes]、[options])は、属性がオプションであることを示します。属性を含めるか、属性にnullを含めると、成功とエラーのコールバックが発生します。属性に何も含めない場合、コールバックは発生しません。
Kevin

6
backbone.js [ backbonejs.org/docs/backbone.html ] のソースコードを確認しました。attrは必須のようです。「オプション」のみが指定されている場合、関数はそれを「attr」であると想定し、呼び出しを混乱させます
Kumaresan

58

いくつかのために、未知の理由で、上記の方法のどれも私のために働いていません。私の場合、APIのみがヒットしませんでした。

しかし、後でこれを検索しているときに、最初のパラメーターとしてではなく誰かが試したこのリンクにぶつかりました。null{}

this.model.save(null, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

これでうまくいきました。これもお役に立てば幸いです。


3
これが正解です。nullを渡すと、バックボーンはすべての属性をサーバーに送信して保存します。
ポールオリバー

奇妙な奇妙ですが、私の選択した方法。
Matt Fletcher

37

サーバーはJSONオブジェクトを返す必要があります。応答がJSONオブジェクトでない場合、コールバックは発生しません。

成功してもサーバーがJSONオブジェクトを返さない場合は、次のようにdataType: "text"オプションを指定して保存します。

this.model.save([],{
 dataType:"text",
 success:function() {},
 error:function() {}
});

このオプションを使用すると、応答でJSONではなくテキストを待機するため、コールバックが起動します。


ホーリークラップありがとうございます。これは私をあざけりました。これは、バックボーンドキュメントのどこかに記載されていた場合には素晴らしいだろう
トビアスJを

これは私のお尻を救った。私はExpress 4でres.json({success:result})を使用していましたが、それでも問題が解決しませんでした。多分私はする必要があります:res.json({"success": "result"})または何か...
Alexander Mills

どうもありがとう!これは私の日を作りました。
alcfeoh 2018

11

バックボーンはすでにこれに依存しているため、次のようにアンダースコアlibを使用できます。saveの最初の引数は属性を持つ必要があるか、モデル自体を保存する場合は{}を渡すだけでよいことに注意してください。

this.model.save({}, _.bind(function(model, response){
  //Do whatever you want e.g.
  this.collection.add(model)
}, this))

8

少し混乱しています-保存イベントを呼び出すためにすべての属性を渡す必要がありますか?モデルが大きい場合はどうなりますか。すべてのプロパティを手動で設定したくない

imはmodel.saveを呼び出し、次のことを試みます。

this.model.save(
    {
        success: function (model, response) {
            console.log('model saved');
        }
    });

誰かがこの投稿を見つけた場合に備えて、自分の質問に答えるだけでいいので、次のようにしました。

this.model.save({ id: this.model.get('id') },
    {
        success: function (model, response) {
            console.log("success");
        },
        error: function (model, response) {
            console.log("error");
        }
    });

編集:なんらかの理由で返信できませんでしたが、編集できます

ただし、idを設定する必要はありません。this.model.get('id')空の属性は属性を拡張しないため、何もしないため、空のオブジェクトを渡すことができます。

this.model.save({}, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

4

以下は、バックボーンモデルの保存に使用しているコードです。

this.model.save(model,{
   success:function(model){
       console.log("Saved Successfully");
   },
   error:function(model){
       console.log("Error");
   }
});

乾杯

ロイMJ


ローカルmodelthis.model.. modelbe に渡すのはややattributesthis.model
煩わしい

@Funkodebat:はい。:) ..これは実際には通常のjquery-ajaxに似ていると思いましたが、Backboneでは、最初のパラメーターはモデルです。必ずしも渡す必要はありませんが、対応するものを取得します。それは確かにかなり不安です.. :(
Roy MJ

まあ、真実は、いいえ、saveを呼び出すときにモデルを渡さないことです。saveの最初の引数は、saveを呼び出す前に設定できる追加の属性です。を呼び出すようなものmodel.set(model.toJSON()); model.save()です。モデルに設定されているものにモデルを設定する理由はありません。保存時にモデルをそれ自体に渡すことは冗長の縮図です。
Funkodebat

2
@Funkodebat彼らが著者の反応を根本的に変えたので、私はこの3年前の答えへのあなたの変更を拒否しました。これは編集/管理システムの意図ではありません。回答が適切でなくなった場合は、投票して新しいものを書きます。モデレートツールは、文法、書式、スペル、大文字の修正のためのもので、他のユーザーの回答を調整するためのものではありません。
Reach4thelasers

2
コミュニティはあなたに反対するでしょう。非常に投票されたトップアンサーを伴う非常に投票された質問です。質問はコミュニティに関連しているようです。何かに同意しない場合は、投票ボタンを使用してください。これは、このサイトに掲載する権利がある質問と回答を指示する場所ではありません。また、他のユーザーの回答を変更して、意味が大幅に変更される場所ではありません。
Reach4thelasers

1

属性を更新せずにモデルを保存したい場合は、以下を実行できます。

model.once("sync", function(model, response, options){
    //
});
model.once("error", function(model, response, options){
    //
});
model.save();

1

関数を初期化するときに、syncメソッドを定義したメソッドにバインドします(onSaveSuccess)。

            initialize: function (options) {
                    this.model.on('sync', _.bind(this.onSaveSuccess, this));
},
            onSaveSuccess: function() {
                console.log('saved');
                this.render();
            },

これにより、this.model.save()を実行するたびに、同期が成功した場合にコールバックとしてonSaveSuccess関数が実行されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.