2012-05-14 8 views
7

Backbone.jsを学び始めていて、this boilerplateで始まり、ディスク上の静的ファイルからJSONデータをロードして、それをHTMLテーブルに表示して例を作りました。Backbone.jsモデルのdestroyメソッドが成功またはエラーイベントを発生させない

次に、コレクションから要素を削除し、次にDOMから削除する予定のボタンにイベントをバインドしようとしました。事はremoveイベントがコレクションにトリガされ、クリックがdestroyメソッドをトリガー、正常に動作しますが、何も手掛かりを持ってdestroy

誰のsuccessまたはerrorコールバックから出てくるん?

モデル:

define([ 
    'underscore', 
    'backbone' 
], function(_, Backbone) { 
    var memberModel = Backbone.Model.extend({ 
    url: "/members.json", 
    defaults: { 
     email: "", 
     firstname: "", 
     lastname: "", 
     gender: "", 
     language: "", 
     consent: false, 
     guid: "", 
     creationDate: "" 
    }, 
    initialize: function(){ 
    } 

    }); 

    return memberModel; 

}); 

ビュー:

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'mustache', 
    'collections/members', 
    'text!templates/members/page.html' 
], function($, _, Backbone, Mustache, membersCollection, membersPageTemplate){ 
    var membersPage = Backbone.View.extend({ 
    el: '.page', 
    initialize: function(){ 
     this.members = new membersCollection(); 

     this.members.on('remove', function(){ 
       // works fine 
      $('.members-body tr').first().remove(); 
      console.log('removed from collection'); 
     }); 
    }, 

    render: function() { 
     var that = this; 

     this.members.fetch({success: function(){ 

      var wrappedMembers = {"members" : that.members.toJSON()}; 

      that.$el.html(Mustache.render(membersPageTemplate, wrappedMembers)); 

      $('#delete-member').click(function(){ 
       that.members.at(0).destroy({ 
         // prints nothing!!! 
        success: function(){ console.log('sucess'); }, 
        error: function(){ console.log('error'); } 
       }); 

      }); 

     }}); 

    } 
    }); 
    return membersPage; 
}); 
+0

あなたのモデルやコレクションに 'url'が設定されていますか? –

+0

はい、モデルとコレクションの両方で 'url'が設定されています – MaxiWheat

答えて

7

私はこれが奇数であることに同意します。まだ何が起こっているのかは完全にはわかりませんが、ここに私が疑うものがあります。

Destroy()コールは有効なJSONを返していません。

  • firebug、fiddlerなどを見て、destroy()レスポンスはどのように見えますか?
  • 私はまた、あなたのdelete-click機能が起動されたときに、何がthatなのか不思議です。
  • destroyはfalseまたはjqXHRオブジェクトを返しますか?

バックボーンに切断が少しあります(少なくとも私は最初は私のものでした)。そのためにdestroy()を呼び出したり、フェッチ/セーブすると、呼び出しは非同期です。呼び出しの直後にdeleteイベントが発生し、コレクションが応答します。後、サーバーが正常に

モデルの削除を認めている「同期」イベント、

:しかし、マニュアルに少し深く掘り、別のイベントは、削除の確認を解雇されます

あなたのコレクションは、削除が成功したと仮定して動作しています。コレクションが確認済みの削除に応答するようにするには、syncイベントを探します。

これは1つの難点を残します。なぜ、エラーハンドラが起動しないのですか?コールバックは、削除の確認に応答するように設計されています。しかし、私はJSの呼び出しスタックは、成功またはエラーとして、それが戻ってきている応答を解釈する方法を知らないと思う。おそらくあなたはAJAXの現実を偶然見つけました。バックボーン、jquery、および他のフレームワークで、ajaxエラー処理を混乱させることができます。 Googleの「jquery ajax error not called」と表示され、エラーイベントが発生しないさまざまなシナリオのホストが見つかります。前後にコメントした後


UPDATE

...二つのことが起こっています。まず、モデルが「新規」と認識されます。これは、Destroy()への呼び出しがサーバー要求をしないことを意味します。その結果、成功/エラーは発生しません。 this commitを参照してください。

これで、私はあなたのモデルが新しい(サーバーに保存されていない)とは思わないと思います。あなたは2つのことのうちの1つを行う必要があります。あなたのモデルID(​​私は仮定する)をあなたのモデルマップのモデルマップにidまたはという名前のプロパティーをモデルのIDに含めてください。あなたのモデルに次の行を貼り付けることで、マッピングは簡単です:idAttribute: "guid"idAttribute hereで詳細を見ることができます。

+0

Google Chromeでテストしています。ネットワークタブを見ると、' destroy'を呼び出すと何も起こりません。また、DELETE HTTP要求が送信されたかどうかを調べるためにFiddlerも試しましたが、そこにも何も起こっていません。 – MaxiWheat

+0

元の投稿にモデル定義を追加してください(フェッチのJSONレスポンスを含む)。また、削除する直前に 'that.members.at(0).IsNew'の値は何ですか? – EBarr

+0

また、この行 'this.members = new membersCollection;'は奇数です。私は直接アサイメントを期待しているか、 'membersCollection()'の後に 'new'の括弧を使用している場合は – EBarr

関連する問題