いくつかの異なる問題が発生していますが、この例は簡単に理解できると思います。このコードは、要素がデフォルトで非表示になっている HTML テンプレートを使用します (CSS を使用)。バックボーン ビューは、モデル内のデータを使用して、適切な値を表示するか、モードに値が存在しない場合は UI 要素を非表示にします。
デフォルトで (CSS を使用して) すべてが非表示になっているテンプレートがあるとします。次に例を示します。
<script type="text/template" id="Person-Template">
<span class="fname" title="FirstName"></span>
<span class="lname" title="LastName"></span>
<span class="age" title="Age"></span>
</script>
各 UI 要素を非表示にするための CSS は次のとおりです。
span.fname,
span.lname,
span.age {
display:none;
}
したがって、私の Backbone.js モデルは次のようになります。
PersonModel = Backbone.Model.extend({
defaults: {
fname: undefined,
lname: undefined,
age: undefined
}
});
ビュー(簡略化)は次のようになります。
PersonView = Backbone.View.extend({
tagName: 'div',
initialize: function() {
this.model.on("fname", this.updateFName, this);
this.model.on("lname", this.updateLName, this);
this.model.on("age", this.updateAge, this);
},
updateFName: function() {
// Pseudo code
Get 'new' value from Model
Obtain reference to DOM element span.fname
Update span.fname
if (model value is empty) {
Hide UI element.
}
},
updateLName: function() {
// Same as above
},
updateAge: function() {
// Same as above
},
render: function() {
// Get model values to display
var values = {
FirstName : this.model.get('fname'),
LastName : this.model.get('lname'),
Age: this.model.get('age'),
};
// Load HTML template
var template = $('#Person-Template').html();
// Populate template with values
var t = _.template(template, values);
// Show / hide UI elements
this.updateFname();
this.updateLName();
this.updateAge();
}
}
最後に、質問: UI 要素を非表示または表示に設定する必要があるかどうかを判断するためだけに、render() から各 updateXYZ() メソッドを呼び出すのはハックに思えます。私のモデルには多くの属性があり、コードは少しばかげているようです。
私はSOで、何を表示すべきか、何を表示すべきかをビューが決定する責任を負うべきではないと言われました。私の質問は、では何が責任を負っているのかということです。ユーザーは、名をクリアする(有効な)アクションを実行する場合があります。その場合、ビューに「名:」の後に値が表示されないようにします。