2

我在 forEach 循环期间创建了一个新的主干模型,然后在内部运行另一个 forEach 循环并创建另一个主干模型并将其作为属性传递回前一个模型。

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

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)
4

1 回答 1

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/

initialize如果您希望它更加 Backbone-ish,您也可以在模型的方法中进行数组初始化。

于 2013-07-15T12:45:55.457 回答