每个函数中的Javascript新对象都不像我想象的那样工作

时间:2013-07-15 10:23:46

标签: javascript backbone.js for-loop underscore.js new-operator

我正在forEach循环中创建一个新的Backbone Model,然后在其中运行另一个forEach循环并创建另一个Backbone Model并将其作为属性传递回以前的Model。

然而,到最后,儿童模型似乎被添加到所有一级模型中。

http://jsfiddle.net/ZBvV4/

var page =
 { rows:
    [
      { layout: '1:1:1'
      , columns:
        [ 
          { widgets: 
              [
                {
                  type: 'twitter'
                }
              , {
                  type: 'facebook'
                }
              ]
          }
        , { widgets: 
              [
                {
                  type: 'image-slider'
                }
              , {
                  type: 'instagram'
                }
              ]
          }
        , { widgets: 
              [
                {
                  type: 'instagram'
                }
              ]
          }
        ]
      }
    , { layout: '2:1'
      , columns:
        [ 
          { widgets: 
              [
                {
                  type: 'twitter'
                }
              ]
          }
        , { widgets: 
              [
                {
                  type: 'image-slider'
                }
              ]
          }
        ]
      }
    ]
 }

var app = {
  models: {}
, collections: {}
, views: {}
}

app.models.Row = Backbone.Model.extend({
  childColumns: []
})

app.models.Column = Backbone.Model.extend({
  childWidgets: []
})

var renderedRows = []

_.each(page.rows, function (row, rowIndex) {
  ////////////// * ROWS * //////////////
  var rowModel = new app.models.Row({
    layout: page.rows[rowIndex].layout
  })
  renderedRows.push(rowModel)

  _.each(row.columns, function (column, columnIndex) {
    ////////////// * COLUMN * //////////////
    var columnModel = new app.models.Column()
    rowModel.childColumns.push(columnModel)
  })
})

console.log('first row child columns', renderedRows[0].childColumns)
console.log('second row child columns', renderedRows[1].childColumns)

1 个答案:

答案 0 :(得分:2)

由于您正在定义模型,这种情况正在发生。

app.models.Row = Backbone.Model.extend({
  childColumns: []
})

问题是childColumns在定义中被设置为空数组[]new每次都不为您创建一个新数组,它为每个模型分配相同的数组引用。这意味着您创建的所有Row条目都引用了相同的数组。

每次创建新条目时,您都希望创建一个新数组,而不是引用单个数组:

app.models.Row = Backbone.Model.extend({
  childColumns: null
})

app.models.Column = Backbone.Model.extend({
  childWidgets: null
})

// ...

_.each(page.rows, function (row, rowIndex) {
  var rowModel = new app.models.Row({
    layout: page.rows[rowIndex].layout
  })
  // Initialize a new array here
  rowModel.childColumns = []
  renderedRows.push(rowModel)

  _.each(row.columns, function (column, columnIndex) {
    var columnModel = new app.models.Column()
    // Initialize a new array here
    columnModel.childWidgets = []
    rowModel.childColumns.push(columnModel)
  })
})

这是一个带有修复的jsFiddle:http://jsfiddle.net/5Epxz/1/

如果你想让它更像Backbone-ish,你也可以在模型的initialize方法中进行数组初始化。