我正在使用骨幹關係模型構建骨幹應用程序(但對於這個問題應該不重要)。Backbone JS代碼味道 - 嵌入子視圖的更好方法?
基本上,我有一個編輯按鈕,將顯示一個隱藏的div。在隱藏的div ID內部,一個子視圖(稱爲DetailsView
)呈現表元素以填充用戶列表。我的模型(對於整個應用程序)看起來大致是這樣的:
{ 'id': 'foo',
'users':
{
'username': 'bobby',
'password': 'peanuts'
},
{
'username': 'sally',
'password': 'watermellon'
}
}
在我的主要觀點(即由上述車型的集合餵養),當用戶點擊編輯按鈕,這是觸發:
edit: function(){
var userModels = this.model.get('users'),
detailViewContainer = this.$('tbody.users');
console.log(name + ' has ' + userModels.length + ' models');
//clear out eveything in tbody.users to prevent dupes
detailViewContainer.html('');
//check if there are actually user models
if(userModels.length > 0){
userModels.forEach(function(user) {
var details = new DetailsView({model: user});
details.render();
detailViewContainer.append(details.el);
});
}
代碼的氣味來自於我必須明確聲明detailViewContainer
的事實。
最初,在我的forEach循環中,會調用包含聲明和呈現DetailsView
的代碼的視圖中的另一個函數。不過,我會放棄this
的背景。
我原來的代碼看起來是這樣的:
edit: function() {
var userModels = this.model.get('users'),
detailViewContainer = this.$('tbody.users');
console.log(name + ' has ' + userModels.length + ' models');
//clear out eveything in tbody.users to prevent dupes
detailViewContainer.html('');
//check if there are actually user models
if(userModels.length > 0){
userModels.forEach(function(user) {
this.renderDetailsView;
});
}
},
renderDetailsView: function(user) {
var details = new DetailsView({model: user});
this.$('tbody.users').append(details.render());
},
在renderDetailsView
,我就輸定了的this
情況下,不能將DetailsView
追加到適當的DOM元素(視圖會附加到所有tbody.users
的DOM元素,因爲this
上下文成爲窗口,因爲它在循環中)。
必須明確聲明一個detailsViewContainer
對我來說似乎很詭異,我希望能夠保持this
上下文指向主視圖,而不是整個窗口。
DetailsView
模板只是一組<tr><td></td></tr>
元素。有沒有更好的方法來嵌入此視圖,而不必訴諸於創建detailViewContainer
?
(一種可能的選擇是具有貫穿全部由自己從this.model.get('users')
返回集合DetailView
環......這有什麼好主意嗎?)
沒有意識到它採取了上下文。我會更新。 – 2012-07-31 22:08:27
哇,沒意識到你可以在上下文中傳遞......頭腦炸開 – CamelBlues 2012-08-01 15:48:37
其實,沒有...... :)我通常不會錯過那樣的東西。 – 2012-08-01 18:00:06