我有几个不同的问题正在进行,我希望这个例子很容易遵循。该代码使用HTML模板,默认情况下隐藏元素(使用CSS)。 Backbone View使用模型中的数据显示适当的值,或者如果模式中没有值,则隐藏UI元素。Backbone.js - 视图和模型之间的关系?
鉴于这里的一切在默认情况下(使用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();
}
}
最后一个问题:它似乎哈克呼召呈现每个updateXYZ()()方法只是确定是否隐藏或显示的UI元素进行设置。我的模型中有很多属性,代码看起来真的很荒谬。
I have been told on SO该视图不应该负责确定应该或应该显示什么。我的问题是,那么什么是负责任的?用户可以执行一些清除名字的(有效)声调,在这种情况下,我不希望我的视图显示“名字:”,后面没有值。
您可以在模板中使用if语句来有条件地显示HTML块。 下面是关于SO的一个例子: http://stackoverflow.com/questions/7230470/how-to-use-if-statements-in-underscore-js-templates – Chris