我的 ListClass 看起来像这样:
var ListView = Backbone.View.extend({
initialize: function() {
this.render();
},
events: {
'click ul#perpage span': 'setperpage'
},
setperpage: function(event) {
this.collection.perpageurl = '/perpage/' + $(event.target).text();
this.collection.fetch();
this.render();
},
render: function() {
template = _.template('\
<table>\
<% _(collection).each(function(model){%>\
<tr><td><%=model.id%></td><td><%=model.name%></td><td><%=model.email%></td></tr>\
<%}); %>\
</table>\
<ul id="perpage">\
<li><span>5</span></li>\
<li><span>10</span></li>\
</ul>\
');
var context = {collection: this.collection.toJSON()};
$(this.el).html(template(context));
$('#app').html(this.el);
return this;
}
});
某些情况下,在我第一次访问加载此视图的页面时,会显示5个项目(这是应该发生的)。但是,当我通过单击<span>10</span>
来触发“setperpage”事件时,即使更新了URL并调用了fetch()
,列表仍然不会更新。(我使用Firebug观察了请求,所以我知道我已经获得了包含10个项目的JSON响应)。为什么它们不重新渲染呢?我仍然只看到5个项目。
this.render
,当this.render
被调用时,this
将会引用到错误的东西。你需要先赋值self=this
,然后使用self.render
。 - Jamie Wongthis.collection.bind("refresh", (function(self) { return function() {self.render();}; }(this));
来解决。不过你的解决方案可能更清晰明了。 - Jamie Wongthis
的引用,我会使用_.bind
,或者更好地使用Backbone的Event.on
,第三个参数是可选的上下文:this.collection.on("reset", function() { this.render(); }, this);
- Cristi Mihaithis.collection.on( 'reset', this.render, this );
? - ndequeker