您可以使视图足够智能,以便在拥有所需的一切之前不进行渲染。
假设您有一个用户和一个任务,并将它们都传递给视图的构造函数:
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;
}
So render
将等到两个this.user
and this.task
在填充正确的 HTML 之前已完全加载;如果在加载模型之前调用它,则它不会渲染任何内容并返回一个空占位符。这种方法将视图的所有逻辑很好地隐藏在它所属的视图内,并且很容易泛化。
Demo: http://jsfiddle.net/ambiguously/rreu5jd8/ http://jsfiddle.net/ambiguous/rreu5jd8/
您还可以使用下划线isEmpty http://underscorejs.org/#isEmpty(这是混合到 Backbone 模型中 http://backbonejs.org/#Model-Underscore-Methods) 而不是检查特定属性:
render: function() {
if(!this.user.isEmpty()
&& !this.task.isEmpty()) {
this.$el.append(this.template({
task: this.task.toJSON(),
user: this.user.toJSON()
}));
}
return this;
}
当然,这是假设您没有任何默认值。
Demo: http://jsfiddle.net/ambiguously/4q07budc/ http://jsfiddle.net/ambiguous/4q07budc/