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);
    }
    });
 },

提前谢谢

4

2 回答 2

1

有 2 种方法可以响应主干事件:使用回调(就像您上面所说的那样)或使用事件绑定。对于一般情况,我认为事件绑定是更惯用和“骨干”的方法,原因如下:

  • 事件允许代码中的多个位置对同一事件做出反应,而只能有一个回调
  • 骨干是围绕事件设计的,因此这种方法是一致的并且是“骨干”
  • 只有当你想覆盖默认的事件调度行为时,回调样式才是真正需要的
  • 我相信回调风格是受 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();

其他一些辅助点:

  • 您不一定需要每次获取一个新的视图实例,您可以只创建一个,将模型传递给它的构造函数,并让它在每次获取时重新呈现自己。这将有助于避免由于遗留事件绑定导致的内存泄漏
  • 不要将参数传递给render(). 它不是为期待他们而设计的。通过构造函数参数将模型传递给视图,然后根据需要options.model从内部引用模型。render
于 2012-11-27T03:49:06.897 回答
0

如果您希望对每个事件都有一致的反应,那么绑定到change事件的方法通常可以很好地工作。

Backbone fetch返回一个jqXHR对象,该对象可以与 Deferred 对象一起使用。我发现这种方法通常看起来更好。

这是它的样子:

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 回答