Вложенные свойства в модели Backbone, изменяющей объект по умолчанию [duplicate]

0
задан James P. Wright 23 October 2012 в 01:48
поделиться

1 ответ

Я бы предположил, что ваша проблема - это ваш defaults в Player:

var Player = Backbone.Model.extend({
    defaults: {
        id: 0,
        name: '',
        coins: new Coins()
    },
    //...
});

То, что defaults будет неточно скопировано в новый Player s, так что они все в конечном итоге обмениваются точно такими же coins: new Coins(). Подобные вещи случаются всякий раз, когда defaults содержит любые изменяемые данные (т. Е. Массивы, литералы объектов, ...). Таким образом, все из них:

this.Taylor.get("coins")
this.Sugar.get("coins")
this.Darlene.get("coins")
this.Cody.get("coins")

окажется в точности как тот же самый объект. В fine manual сказано следующее:

defaults model.defaults or model.defaults()

Хэш (или функция) по умолчанию может использоваться для указания значения по умолчанию атрибуты для вашей модели. При создании экземпляра модели любые неопределенные атрибуты будут установлены в их значение по умолчанию. [...] Помните, что в JavaScript объекты передаются по ссылке, поэтому, если вы включаете объект в качестве значения по умолчанию, он будет использоваться для всех экземпляров.

Обратите внимание, что в конце немного оговорено. Если вы используете функцию для defaults:

var Player = Backbone.Model.extend({
    defaults: function() {
        return {
            id: 0,
            name: '',
            coins: new Coins()
        };
    },
    //...
});

, вы должны получить 'coins' для каждого Player. В качестве альтернативы вы можете вручную установить 'coins' в свой initialize:

var Player = Backbone.Model.extend({
    //...
    initialize: function() {
        this.set('coins', new Coins);
        // Or only set it if it isn't there if that makes sense...
    },
    //...
});
3
ответ дан mu is too short 25 August 2018 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: