0

問題

子モデルが初めて初期化されるとき、子のデフォルトのみが属性として設定されます。

2 番目 (および後続のすべて) の子が初期化されている場合、子の属性は、子とその親のデフォルトを表示します。

フィドル

var Parent = Backbone.Model.extend({
    defaults: {
        name: "john",
        lname: "smith",
        age: 30,
        language: "english",
        location: "belgium"
    }
});

var Child = Parent.extend({
    defaults: {
        hobby: "doing nothing",
            age: 24,
        occupation: "student"
    },
    initialize: function () {
        this.constructor.__super__.initialize.apply(this, arguments);
        _.defaults(this.defaults, this.constructor.__super__.defaults);
        console.log(this.attributes);            
    }
});

初めて初期化された子の属性:

 var child1 = new Child();

child1.attributes :

 hobby: "doing nothing"
 age: 24
 occupation: "student"

2 回目に初期化された同じ Child クラスの属性:

var child2 = new Child();

child2 属性:

age: 24
hobby: "doing nothing"
language: "english"
lname: "smith"
location: "belgium"
name: "john"
occupation: "student"

質問

子モデルが初めて初期化されるときに、すべてのデフォルト (子および親) が属性として設定されないのはなぜですか?

Backbone.Collectiona の中に aを表示する必要があり<ul>、すべてのモデルの属性は、 each 内の html フォームを介して構成できるため<li>です。しかし、この問題のため、コレクション内の最初のモデルのすべての属性を取得できません。

4

1 に答える 1

1

defaultsメソッドの実行中に、最初のオブジェクトがインスタンス化されるときに、Child クラスのオブジェクトを変更していますinitialize。その時点で、Backbone.Model コンストラクターはdefaultsそのオブジェクトの属性を埋めるために既に使用されているため、後続のインスタンス化にのみ影響します。

Backbone.Model を見てみましょう:

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

initializeデフォルトが設定された後の最後のステップであるためdefaults、その時点で変更しても現在のオブジェクトには何も起こりません。

defaults希望どおりに動作させるには、クラスの宣言中ではなく、クラスの宣言後に変更しinitializeます。

Child.prototype.defaults = _.defaults(Child.prototype.defaults, Parent.prototype.defaults);

実施例

于 2013-07-09T17:35:45.790 に答える