在获取内容之前调用Backbone.js

时间:2013-08-24 15:15:00

标签: javascript backbone.js

我找到了一些Backbone.js代码的示例,然后我根据自己的需要采用了这些代码。

在获取任何内容之前调用render的{​​{1}}函数。当有内容要呈现时,它似乎不再被调用。

后端返回两个结果,所以这不是问题。

CommentListView

2 个答案:

答案 0 :(得分:4)

fetch的行为在Backbone 1.0.0中发生了一些变化。来自ChangeLog

  
      
  • 将集合的“更新”重命名为 set ,以获得与类似model.set()的并行性,并与重置形成对比。它现在是 fetch 之后的默认更新机制。如果您想继续使用“重置”,请传递{reset: true}
  •   

Collection#fetch说:

  

抓取 collection.fetch([options])

     

从服务器获取此集合的默认模型集,并在集合到达时设置。 [...]当模型数据从服务器返回时,它使用 set 来(智能地)合并获取的模型,除非您通过{reset: true}

您的initialize只是绑定到"reset"

this.model.bind("reset", this.render, this);

您可以绑定"add"生成的"remove""change""reset"事件,也可以明确要求fetch事件你this.commentList.fetch({ reset: true });

CommentListView

我在这里的其他一些事情:

  1. 由于您的collection视图使用的是集合而非模型,因此您可能需要将其称为this.commentListView = new CommentListView({collection: this.commentList});

    this.collection

    然后在视图中引用this.collection.each(function(model) { ... })。有关视图构造函数如何处理其参数的详细信息,请参阅Collection#set

  2. 收藏集有各种View#initialize,因此您可以说_.each(this.model.models, ...)而不是el
  3. 视图维护Underscore methods mixed in中jQuery包装的this.$el的缓存版本,因此您可以说$(this.el)而不是console.log(this.model.models)
  4. 小心this.model.models之类的事情。控制台通常会抓取实时引用,因此当您查看而不是在调用console.log时,控制台中显示的状态将是console.log(this.model.toJSON())的状态。面对时间和AJAX问题时,使用on更可靠。
  5. 您可能希望切换到$el而不是listenTo(AKA {{1}}),因为它不太容易受到内存泄漏的影响。

答案 1 :(得分:0)

通常用于为fetch创建一个监听器,当fetch完成并更改模型或集合时会有一个回调。试试这个:

var AppRouter = Backbone.Router.extend({

    routes:{
        "":"list"
    },

    list:function () {
        this.commentList = new CommentCollection();
        this.commentListView = new CommentListView({model:this.commentList});
        this.listenTo(this.commentList,'change', this.makeRender);
        this.commentList.fetch();


    },
    makeRender: function(){
        $('#sidebar').html(this.commentListView.render().el);
   }

});