3

次のモデルを使用します。

MyModel= Backbone.Model.extend({
  defaults : {
    myNestedModel:undefined,
  },
  initialize: function() {
    this.set({myNestedModel: new MyNestedModel());
  }
});

'myNestedModel'という名前の単一のプロパティがあり、次の定義があります。

MyNestedModel= Backbone.Model.extend({
  defaults : {
    myModel:undefined,
  }
});

これも、単一のプロパティ名「myModel」を持っています。MyModelのインスタンスを作成すると、次のようになります。

aModel = new MyModel();

ネストされたモデルは、MyModelのinitializeメソッドで設定されます。次に、2段階のプロセスでJSON.stringifyを使用します。

// Use Backbone.js framework to get an object that we can use JSON.stringfy on
var modelAsJson = aModel.toJSON();

// Now actually do stringify 
var modelAsJsonString = JSON.stringify(modelAsJson);

これは正常に機能し、MyModelのJSON表現とMyNestedModelのプロパティを取得します。デフォルトを使用すると、問題が発生します。次に例を示します。

MyModel= Backbone.Model.extend({
      defaults : {
        new MyNestedModel(),
      }
    });

JSON.stringifyは循環参照をサポートしていないため、これにより問題が発生します。MyModelのすべてのインスタンスがMyNestedModelの同じインスタンスを共有しているため、循環参照が作成されていると思います。一方、initializeメソッドは、インスタンスごとに新しいネストされたモデルを作成します。

質問:

  1. defaults:{}問題の「原因」であるという私の理解は正しいですか?
  2. 最近投稿した質問から、すべてのプロパティにデフォルトを使用する必要があるという印象を受けました。その場合、この投稿/質問で提示されたシナリオでデフォルトをどのように使用する必要がありますか?
  3. defaults:{} 値がいつ適用されるか、いつオーバーライドされるか、インスタンスが同じデフォルトの「インスタンス」を共有するかどうかに関して、誰かがの使用法を明確にできますか?
4

1 に答える 1

7

デフォルトは、モデル内の属性 (モデル内のデータ) にのみ使用され、モデルを作成するたびに、デフォルトから値を取得して属性を設定します。例えば

User = Backbone.Model.extend({
     defaults : {
         rating : 0
     }
})

User1 = new User({ name : 'jack', email : 'jack@gmail.com' });
User2 = new User({ name : 'john', email : 'john@gmail.com' });

User1.set({ rating : 2 });

toJSONで呼び出されたときに2つのモデルが印刷されます

{
   rating: 2,
   name: 'jack',
   email: 'jack@gmail.com'
}
{
   rating: 0,
   name: 'john',
   email: 'john@gmail.com'
}

defaults はオブジェクトであるため、そこに配置したすべての値はすぐに評価されます。

defaults : {
    rating : defaultRating()
}

defaultRating() を呼び出します-モデルを初期化するたびにではなく、すぐに(extendメソッドで)呼び出します

モデルの作成時にいくつかのデータが存在する必要があるモデルには、デフォルトを使用する必要があります (例: new myModel() )。

あなたの例では、次の間違いがあります。

1.プロパティなしで値を設定する

 defaults : {
      PROPERTY : new Model() 
 }

2.デフォルトにそのようなオプションは必要ありません-モデルの属性( data )のみを配置する必要があります

デフォルトは、拡張モデルで新しいデフォルトに置き換えられない限り、常に適用されます。

 var Model = Backbone.Model.extend({ defaults : { alpha : 'beta' } });
 var myModel = Model.extend({ defaults : { beta : 'gama' } });

今、あなたの myModel が初期化されると、

 { beta : 'gama' } // alpha : 'beta' will not be set as value, because it is replaced
于 2012-04-08T07:17:32.667 に答える