您可以使视图足够智能,以便在它拥有所需的一切之前不渲染。
假设您有一个用户和一个任务,并将它们都传递给视图的构造函数:
initialize: function(user, task) {
_.bindAll(this, 'render');
this.user = user;
this.task = task;
this.user.on('change', this.render);
this.task.on('change', this.render);
}
现在您有一个视图,它同时引用了用户和任务,并且正在监听"change"
两者上的事件。然后,该render
方法可以询问模型是否拥有他们应该拥有的一切,例如:
render: function() {
if(this.user.has('name')
&& this.task.has('name')) {
this.$el.append(this.template({
task: this.task.toJSON(),
user: this.user.toJSON()
}));
}
return this;
}
所以render
将等到this.user
和this.task
都完全加载后才填充正确的 HTML;如果在加载模型之前调用它,则它不呈现任何内容并返回一个空占位符。这种方法将所有视图的逻辑很好地隐藏在它所属的视图中,并且很容易泛化。
演示:http: //jsfiddle.net/ambiguous/rreu5jd8/
您还可以使用 Underscore isEmpty
(混合到 Backbone 模型中)而不是检查特定属性:
render: function() {
if(!this.user.isEmpty()
&& !this.task.isEmpty()) {
this.$el.append(this.template({
task: this.task.toJSON(),
user: this.user.toJSON()
}));
}
return this;
}
这假设您当然没有任何默认值。
演示:http: //jsfiddle.net/ambiguous/4q07budc/