我有幾個不同的問題正在進行,我希望這個例子很容易遵循。該代碼使用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