0

非常に不快な状況に陥りました。

モデルの初期化のコードは次のとおりです。

var Model = Backbone.Model = function(attributes, options) {
    var attrs = attributes || {};
    options || (options = {});
    this.cid = _.uniqueId('c');
    this.attributes = {};
    if (options.collection) this.collection = options.collection;
    if (options.parse) attrs = this.parse(attrs, options) || {};
    attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
    this.set(attrs, options);
    this.changed = {};
    this.initialize.apply(this, arguments);
};

ここでの問題は、モデルが init で属性マップを取得するときに、属性が既に存在する場合はデフォルト値を無視し、コンストラクターに渡されたものを設定する前にデフォルト値を設定しないことです。

論理的に考えると、デフォルトは常に初期化の最初に設定され、「set」メソッドがそのように呼び出されると値が置き換えられると予想されるため、「set」メソッドをオーバーライドして配列型属性を処理し、それらをコレクションに変換することができます。 :

set: function () {
    var firstArgument = arguments[0],
        attributesMap;
    if (_.isObject(firstArgument)) {
        //setting with attributes map
        attributesMap = firstArgument;
        _.each(attributesMap, function (value, attribute) {
            var modelAttribute = this.attributes[attribute];
            if (modelAttribute && modelAttribute instanceof Backbone.Collection) {
                modelAttribute.reset(value);
                delete attributesMap[attribute];
            }
        }, this);
    }

    return Backbone.Model.prototype.set.apply(this, arguments);
}

今私がやっていること - デフォルトの属性が Backbone.Collection のインスタンスであるかどうかを確認し、そうであれば、指定された配列値でコレクションをリセットし (同じコレクション参照を維持し、ビューまたは他のデータ オブジェクトがそのコレクションをリッスンできるようにします)、それを防ぎます。通常の配列で上書きされないようにします。

「set」メソッドを呼び出すときに前述した問題のため、デフォルトの属性がなく、操作したい属性のタイプを確認できません。

配列であり、変換して Backbone.Collection として扱う必要がある属性をどのように処理しますか?

今のところ、「デフォルト」関数の動作を変更しただけで、属性オブジェクトを返す代わりに、次のようにします。

defaults: function () {
    this.attributes = {
        ...
    };
}
4

1 に答える 1