必要なものがすべて揃うまでレンダリングしないように、ビューをスマートにすることができます。
ユーザーとタスクがあり、両方をビューのコンストラクターに渡すとします。
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
の両方が完全にロードされるまで待ってから、適切な HTML に入力します。モデルがロードされる前に呼び出された場合、何もレンダリングせず、空のプレースホルダーを返します。このアプローチでは、ビューのすべてのロジックが、それが属するビュー内にうまく隠され、簡単に一般化できます。this.user
this.task
デモ: http://jsfiddle.net/ambiguous/rreu5jd8/
特定のプロパティをチェックする代わりに、アンダースコアisEmpty
(バックボーン モデルに混在) を使用することもできます。
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/