Javascript 主干-对于fetch实际在做什么以及我是否';我通过创建回调来正确使用它

Javascript 主干-对于fetch实际在做什么以及我是否';我通过创建回调来正确使用它,javascript,backbone.js,Javascript,Backbone.js,刚开始使用主干,有一个快速的问题,我想写一个简单的留言板。我想要一些响应hash change detail/:id的东西,并像这样将其添加到路由器中。这似乎有效,但我不认为这是正确的做法。一般来说,这就是http调用获取对象的方式(特别是成功回调) var MessageBoardRouter=Backbone.Router.extend({ 路线:{ “detail/:id”:“showDetail/, }, showDetail:功能(id){ console.log('在showDeta

刚开始使用主干,有一个快速的问题,我想写一个简单的留言板。我想要一些响应hash change detail/:id的东西,并像这样将其添加到路由器中。这似乎有效,但我不认为这是正确的做法。一般来说,这就是http调用获取对象的方式(特别是成功回调)

var MessageBoardRouter=Backbone.Router.extend({
路线:{
“detail/:id”:“showDetail/,
},
showDetail:功能(id){
console.log('在showDetail中,带有'+id');
//var p1=新帖子({header:'my original header'});
var p2=新帖子({id:id});
p2.fetch({

success:function(){/有两种方法可以响应主干事件:回调(如上所述)或事件绑定。我认为,对于一般情况,事件绑定是更为惯用和“backboney”的方法,原因如下:

  • 事件允许代码中的多个位置对同一事件作出反应,而只能有一个回调
  • 主干网是围绕活动而设计的,因此这种方法是一致的和“主干网”
  • 只有当您想要覆盖默认的事件分派行为时,才需要回调样式
  • 我相信回调风格的灵感来自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()
    。它不是为期望它们而设计的。请通过
    选项将模型传递给视图。model
    构造函数参数,然后根据需要从
    render
    中引用模型

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

返回可与延迟对象一起使用的对象。 我发现这种方法通常看起来更好

这就是它的样子:

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

对于响应,我已更新代码以删除对模型的引用,并将其放置在视图的options.model中。“change”事件的绑定是否会导致fetch的异步性质出现问题?必须运行到晚餐。否,您调用fetch,异步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});
    var view= new MbDetail();

    p2.fetch().done(function() {
     view.render(p2);
     console.log(p2.attributes);
    });
 },