gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:12:02 25 4
gpt4 key购买 nike

我在 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)

最佳答案

这是由于您定义模型的方式造成的。

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,您也可以在模型的 initialize 方法中进行数组初始化。

关于每个函数中的 Javascript 新对象都没有像我想象的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17651978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com