9

私は backbone.js を試していましたが、新しいモデル オブジェクトを作成してから model.save() を呼び出すと、うまくいきませんでした。データベースの ID でモデル オブジェクトを更新する backbone.js のデフォルトの動作を期待していますが、そうではありません。これは起こるべきではありませんか?json 形式の属性を含む投稿を取得していることを確認しました。私のサーバーはjsonをテーブルに保存し、新しいidフィールドを含むjsonをbackbone.jsに返します。これは正しいです?サーバーは新しいオブジェクト全体を返す必要がありますか、それとも単に id または何を返す必要がありますか?

//contents of the POST from backbone.js
  { "text":"this is a test" }

//reply from my server
  { id:"15", text:"this is a test"  }

私のサンプルコードは以下です

var SQLRow = Backbone.Model.extend({
 table:"",
 urlRoot:'db',
 url:function () {
    return "/" + this.urlRoot + "?table=" + this.table + 
                 "&id=" + this.attributes.id;
   }
});

var Xtra = SQLRow.extend ({
   table:'Xtra'
});

var row = new Xtra({
  text: "this is a test" 
});

alert(row.url());
row.save()
alert("row:" + row.get("id"));
4

4 に答える 4

6

あなたの投稿から言うのは難しい。2つのアイデア:

1)サーバーからの応答が成功しません保存呼び出しは何を返しますか?

2)「id」属性にはID以外の名前が付けられています。別の名前を説明するには、モデルに次を追加します。

   idAttribute  : "MyModelsID",

編集

IDが返される前にアラートが発生する、タイミングの問題が発生している可能性があります。最後の2行の代わりに、これを試してください。

row.save( null, 
              { 
                 success : function(model, response) { alert(model.get('id'); } 
               }
         );

@mu_is_too_shortが述べたように、別の方法は、モデル上でも変更をリッスンし、イベントに応答することです。(私は答えをできるだけあなたのコードに近づけようとしていました)。しかし、次の擬似コードのようなものがあなたを始めるはずです...

var myView = Backbone.View.extend({
           ....
           initialize : function () {
                this.collection.bind('change',  this.SOME_LISTENING_FUNC    );

             }
  });

または、コレクション/ビューのない世界にいる場合は、このようなものがリスナーを作成します...

row.on('change',  function() {  /* do stuff */ }, this);               
于 2012-05-08T18:15:21.057 に答える
0

私は同じ問題に直面しましたが、私が見つけたのはvalidate、保存されたモデルの機能がバックエンドから返されたモデルを実際に無効にすることです。そのため、フィールドが適切に更新されませんでした。

于 2014-05-21T10:17:45.617 に答える
0

少し時代遅れかもしれませんが、今日も同じ ID がありませんでした。サーバーは、新しい ID を含むリダイレクトを含むヘッダー 'Location' を送信するだけで、永続化されたオブジェクトを返さないことが判明しました。オブジェクトを応答に追加することが解決策でした。Roo(Spring) で生成された Json-Controller では、オブジェクトを返さないのが標準的な動作のようです。

于 2015-02-03T12:13:05.530 に答える