Javascript 为什么我的主干集合包含一个空的模型项?

Javascript 为什么我的主干集合包含一个空的模型项?,javascript,backbone.js,marionette,Javascript,Backbone.js,Marionette,我有一个带有记分卡属性的游戏模型,它是一个集合。我正在嵌套此集合,因此在初始化时,我将使用nestCollection创建更改处理程序,以保持所有内容的更新和同步。每当我创建一个新的游戏模型时,一个空模型被添加到记分卡属性集合中,但只在内存中—保存到localstorage的内容是正确的。我不明白为什么 这是我的游戏模型定义-请注意控制台日志语句结果: var Game = Backbone.Model.extend({ localStorage: new Backbone.LocalStora

我有一个带有记分卡属性的游戏模型,它是一个集合。我正在嵌套此集合,因此在初始化时,我将使用nestCollection创建更改处理程序,以保持所有内容的更新和同步。每当我创建一个新的游戏模型时,一个空模型被添加到记分卡属性集合中,但只在内存中—保存到localstorage的内容是正确的。我不明白为什么

这是我的游戏模型定义-请注意控制台日志语句结果:

var Game = Backbone.Model.extend({
localStorage: new Backbone.LocalStorage('datastore'),
defaults: {
    name     : '',
    scorecards: new ScorecardList(),
    created   : 0
},

initialize : function() {
    console.log(this.scorecards);           // prints undefined
    console.log(this.get('scorecards'));    // length is 0 as expected

    this.scorecards = nestCollection(this, 'scorecards', new ScorecardList(this.get('scorecards')));

    console.log(this.scorecards);           // length is 1, with empty element in it
    console.log(this.get('scorecards'));    // length is 0 as expected

    if (this.isNew()) this.set('created', Date.now());
}
});
嵌套代码:

function nestCollection(model, attributeName, nestedCollection) {
//setup nested references
for (var i = 0; i < nestedCollection.length; i++) {
    model.attributes[attributeName][i] = nestedCollection.at(i).attributes;
}
//create empty arrays if none

nestedCollection.bind('add', function (initiative) {
    if (!model.get(attributeName)) {
        model.attributes[attributeName] = [];
    }
    model.get(attributeName).push(initiative.attributes);
});

nestedCollection.bind('remove', function (initiative) {
    var updateObj = {};
    updateObj[attributeName] = _.without(model.get(attributeName), initiative.attributes);
    model.set(updateObj);
});
return nestedCollection;
}

您的问题来自以下代码:

new ScorecardList(this.get('scorecards'))
在这里,您将为您的
记分卡列表
构造函数提供另一个集合作为参数。此集合恰好是一个对象。所以你的集合的构造函数会认为它是你用来创建模型的对象

因此,基本上,
this.get('scorecards'))
被转换到
记分卡中(或者无论您的模型被称为什么),这就是为什么您有一个空模型


将参数传递给构造函数的目的与创建集合的目的不同,这是一个坏主意,您应该在之后调用一个方法。

您的问题来自以下代码:

new ScorecardList(this.get('scorecards'))
在这里,您将为您的
记分卡列表
构造函数提供另一个集合作为参数。此集合恰好是一个对象。所以你的集合的构造函数会认为它是你用来创建模型的对象

因此,基本上,
this.get('scorecards'))
被转换到
记分卡中(或者无论您的模型被称为什么),这就是为什么您有一个空模型


将参数传递给构造函数的目的与创建集合的目的不同,这是一个坏主意,您应该在创建集合后调用一个方法。

谢谢-这是我一直遵循的方法,但是您建议我如何将记分卡属性传递给集合以供填充?我有点担心您想做什么。你能换个说法吗?顺便说一句,把一个集合放在
默认值
对象中通常是个坏主意,因为同一个集合(实例,对象)将被你的
游戏的所有实例所共享。你给了我答案,或者至少足够让我自己弄明白。我需要将默认记分卡设置从集合更改为标准数组,并将此默认设置移动到初始值设定项(如果它不存在)。谢谢-这是我一直遵循的路径,但您建议我如何将记分卡属性传递到集合以进行填充?我有点担心您想做什么。你能换个说法吗?顺便说一句,把一个集合放在
默认值
对象中通常是个坏主意,因为同一个集合(实例,对象)将被你的
游戏的所有实例所共享。你给了我答案,或者至少足够让我自己弄明白。我需要将默认记分卡设置从集合更改为标准数组,并将此默认设置移动到初始值设定项(如果它不存在)。