Backbone js代码气味-嵌入子视图的更好方法
Backbone js code smell - better way to embed a sub-view?
我正在使用主干关系模型构建一个主干应用程序(但这对这个问题来说并不重要)。
基本上,我有一个编辑按钮,它将显示一个隐藏的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
?
(一个可能的选择是让DetailView
循环通过从this.model.get('users')
返回的集合…这是个好主意吗?)
如果您正在做的事情是因为丢失了"this",那么您可以将上下文传递给forEach。
userModels.forEach(function(user) {
this.renderDetailsView();
},this);
现在你有了合适的"这个"。希望这能有所帮助。
相关文章:
- 有没有更好的动手、具体的方法来学习Javascript
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- 在JavaScript中拆分日期字符串的更好方法是什么
- 为什么$.brower被弃用?还有什么更好的替代方案
- 设置嵌套对象属性的更好方法
- 您有更好的动态方式来缩短复杂的代码jquery吗
- 用Javascript重新格式化复杂文本日期字符串的更好方法
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- 如何创建更好的方式来维护基于我的代码访问的最后一个页面
- Backbone js代码气味-嵌入子视图的更好方法
- 在主干视图中使用 mixins - 哪种是更好的方法
- 使用 Knockoutjs 显示视图模型中数据的更好方法
- 在 MVC3 视图中使用嵌入式 JavaScript 还是单独的 .js 文件更好
- 更好的方法是使用assets/javascript/*.js或*.js.erb视图中的ajax调用
- 将脚本放置在layout视图或每个视图中更好
- Backbone js路由器-组织视图的更好方式
- 如何在web单页应用程序中更好地组织多个视图
- 组合优于继承,这是向视图添加额外功能而不诉诸继承的更好方式
- 添加DOM视图太慢了,需要一种更好的方法来缓存一次视图并重用它供以后使用
- 在RTL模式下获得可滚动DIV的视图的更好方法