專注於你的重置,呈現了收藏的問題,這是我會怎麼做。這種方式假定當你創建你的視圖時,$ el已經存在,並且你通過View構造函數傳遞它,所以它已經準備好了。
var SearchView = Backbone.View.extend({
template: _.template('<span><%= term %></span>');
initialize: function(){
this.collection.bind("reset", this.render, this);
},
render: function(){
this.addAllTerms();
return this;
},
addAllTerms: function() {
var self = this;
this.collection.each(function(model) {
self.addTerm(model);
});
},
addTerm: function(someModel) {
this.$el.next('#suggestions').append(this.template(someModel.toJSON()));
}
});
這與您的方法在幾個方面有點不同。首先,我們利用Underscore的模板功能。這可能是從span到li到div的任何東西。我們使用<%=%>來表示我們要插入一些值(它將來自我們的model.term屬性)。
而不是去處理程序然後渲染,我只是綁定集合呈現。
render()
假設我們總是要刷新整個事情,從頭開始構建。 addAllTerms()
只需循環收集。您可以使用forEach()
或只是each()
這是除了forEach()
是一樣的東西是3個字符太懶了我的懶惰流氓。 ;-)
最後,addTerm()
函數採用一個模型並將其用於它將附加到#suggestions的值。基本上,我們說「用插值附加模板」。我們將上面的模板函數定義爲此View對象屬性,以清楚地將模板與數據分開。雖然你可以跳過這部分,但只是append('<span>' + someModel.get('term') + '</span>')
或什麼不是。 _.template()使用我們的模板,並且還使用與我們模板中的屬性對齊的屬性的任何類型的對象。在這種情況下,'期限'。
這只是一個不同的方式來做你正在做的事情。我認爲這段代碼更易於管理。例如,也許你想添加一個新術語而不刷新整個集合。 addTerm()
函數可以獨立運行。
編輯:
並不重要,但有些事我的模板使用,我發現有用的,我沒有看到它,當我第一次開始了。當你傳遞model.toJSON()
到模板功能,我們基本上是通過所有的模型屬性中所以,如果該模型是這樣的:
defaults: {
term: 'someTerm',
timestamp: '12345'
}
在我們前面的例子中,該屬性時間戳也傳遞不使用,只使用<%= term %>
。但是我們也可以通過將它添加到模板中來輕鬆插入它。我想知道的是,您不必限制自己從一個模型中獲取數據。一個複雜的模板可能有幾個模型的數據。
我不知道這是最好的方式,但我做的是有這樣的事情:
makeHash: function() {
var hash = {};
hash.term = this.model.get('term');
hash.category = anotherModel.get('category');
var date = new Date();
hash.dateAccessed = date.getTime();
return hash;
}
所以,你可以輕鬆地構建自己的自定義哈希扔成模板,聚集所有的您想要將數據插入到要傳遞到模板中的單個對象中。
// Instead of .toJSON() we just pass in the `makeHash()` function that returns
// a customized data object
this.$el.next('#suggestions').append(this.template(this.makeHash()));
您還可以輕鬆地傳入整個對象。
makeHash: function() {
var hash = {};
hash.term = this.model.get('term');
var animal = {
name: 'aardvark',
numLegs: 4
};
hash.animal = animal;
return hash;
}
並通入我們的模板看起來像這樣的:
template: _.template('<span><%= term %></span>
<span><%= animal.name %></span>
<span><%= animal.numLegs %></span>')
我不知道這是否是最好的方式,但它讓我瞭解到什麼數據進入我的模板。也許很明顯,但當我剛開始時,這不適合我。