Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干js代码气味-嵌入子视图的更好方法?_Javascript_Backbone.js_Backbone Relational - Fatal编程技术网

Javascript 主干js代码气味-嵌入子视图的更好方法?

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',

我正在使用主干关系模型构建一个主干应用程序(但这对这个问题不重要)

基本上,我有一个编辑按钮,它将显示一个隐藏的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) {
         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”。希望这能有所帮助。

哇,我不知道你可以通过上下文。。。(事实上,没有……:)我通常不会错过这样的东西。