我有几个不同的问题,我希望这个例子很容易理解。该代码使用默认隐藏元素的 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();
}
}
最后,问题是:从 render() 调用每个 updateXYZ() 方法只是为了确定 UI 元素应该设置为隐藏还是可见,这似乎很不自然。我的模型中有很多属性,代码看起来真的有点荒谬。
有人告诉我,视图不应该负责确定应该或应该显示什么。我的问题是,那么什么是负责任的?用户可能会执行一些(有效的)aciton 来清除名字,在这种情况下,我不希望我的视图显示“名字:”后跟没有值。