Javascript 主干js代码气味-嵌入子视图的更好方法?
我正在使用主干关系模型构建一个主干应用程序(但这对这个问题不重要) 基本上,我有一个编辑按钮,它将显示一个隐藏的div。在隐藏的div id中有一个子视图(称为Javascript 主干js代码气味-嵌入子视图的更好方法?,javascript,backbone.js,backbone-relational,Javascript,Backbone.js,Backbone Relational,我正在使用主干关系模型构建一个主干应用程序(但这对这个问题不重要) 基本上,我有一个编辑按钮,它将显示一个隐藏的div。在隐藏的div id中有一个子视图(称为DetailsView),它呈现表格元素以填充用户列表。我的模型(适用于整个应用程序)大致如下所示: { 'id': 'foo', 'users': { 'username': 'bobby', 'password': 'peanuts' }, { 'username': 'sally',
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) {
this.renderDetailsView;
});
}
},
renderDetailsView: function(user) {
var details = new DetailsView({model: user});
this.$('tbody.users').append(details.render());
},
在我的主视图中(由上述模型的集合提供),当用户单击编辑按钮时,会触发:
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
。然而,我会失去这个的上下文
我的原始代码如下所示:
{ '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) {
this.renderDetailsView;
});
}
},
renderDetailsView: function(user) {
var details = new DetailsView({model: user});
this.$('tbody.users').append(details.render());
},
在renderdeailsview
中,我会丢失this
的上下文,无法将DetailsView
附加到适当的DOM元素(视图将附加到所有tbody.users
DOM元素,因为this
上下文在循环中成为窗口)
必须明确声明一个detailsViewContainer
对我来说似乎很难,我希望能够将this
上下文指向主视图,而不是整个窗口
DetailsView
模板只是一组
元素。是否有更好的方法嵌入此视图而不必创建detailViewContainer
(一个可能的选择是让DetailView
循环遍历从this.model.get('users')
返回的集合本身…这是一个好主意吗?如果您正在做的事情是因为丢失了“this”,您可以将上下文传递给forEach
userModels.forEach(function(user) {
this.renderDetailsView();
},this);
现在,您可以使用适当的“this”。希望这能有所帮助。哇,我不知道你可以通过上下文。。。(事实上,没有……:)我通常不会错过这样的东西。