0

バックボーンを使い始めたばかりで、簡単な質問があり、簡単な掲示板を書こうと思いました。ハッシュ変更detail/:idに応答するものが必要で、これをこのようにルーターに追加しました。これはうまくいくようですが、これが適切な方法ではないと思います。これは、一般的に、http呼び出しがオブジェクトを取得する方法(具体的には成功コールバック)ですか?

var MessageBoardRouter = Backbone.Router.extend({
  routes: {
    "detail/:id" : "showDetail"//,
  },
  showDetail: function(id){
    console.log('within showDetail with ' + id);
    //var p1=new Post({header:'my original header'});
    var p2=new Post({id:id});
    p2.fetch({
     success: function(){   // <- should I be doing this or different way or is who strategy off???
     console.log(p2.attributes);
     var view= new MbDetail();
     view.render(p2);
    }
    });
 },

事前にt​​hx

4

2 に答える 2

1

バックボーンイベントに応答するには、コールバック(上記のように)またはイベントバインディングの2つの方法があります。イベントバインディングは、次の理由から、一般的なケースではより慣用的で「バックボーン」なアプローチであると思います。

  • イベントを使用すると、コード内の複数の場所が同じイベントに反応できますが、コールバックは1つしかありません。
  • それ以外の場合、バックボーンはイベントを中心に設計されているため、このアプローチは一貫性があり、「バックボーン」です。
  • コールバックスタイルは、デフォルトのイベントディスパッチ動作をオーバーライドする場合にのみ実際に必要です。
  • コールバックスタイルはjqueryに触発されており、バックボーン内ではイベントほど一貫性がないと思います

ただし、それを念頭に置いて、どちらのスタイルも問題なく機能します。特定の例では、次のようにコーディングすることをお勧めします。

var p2=new Post({id:id});
p2.on('change', function(post){
 console.log(post.attributes);
 var view= new MbDetail();
 view.render(p2);
}
p2.fetch();

その他の補助的なポイント:

  • フェッチごとに新しいビューインスタンスは必ずしも必要ではありません。1つだけ作成し、モデルをコンストラクターに渡して、フェッチごとにそれ自体を再レンダリングすることができます。これにより、残りのイベントバインディングによるメモリリークを回避できます。
  • に引数を渡さないでくださいrender()。それらを期待するようには設計されていません。options.modelコンストラクター引数を介してモデルをビューに渡し、必要に応じて内部からモデルを参照renderします。
于 2012-11-27T03:49:06.897 に答える
0

すべてのイベントに対して一貫した反応が必要な場合は、イベントにバインドするアプローチがchange一般的にうまく機能します。

バックボーンフェッチは、遅延オブジェクトで使用できるjqXHRオブジェクトを返します。このアプローチは一般的に見栄えが良いと思います。

これはどのように見えるかです:

var MessageBoardRouter = Backbone.Router.extend({
  routes: {
    "detail/:id" : "showDetail"//,
  },
  showDetail: function(id){
    console.log('within showDetail with ' + id);
    //var p1=new Post({header:'my original header'});
    var p2=new Post({id:id});
    var view= new MbDetail();

    p2.fetch().done(function() {
     view.render(p2);
     console.log(p2.attributes);
    });
 },
于 2012-11-27T09:20:17.637 に答える