Backbone.js - 在模型默认值中使用new() - 循环引用

Jac*_*ack 3 backbone.js

采用以下模型:

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

它有一个名为'myNestedModel'的属性,它具有以下定义:

MyNestedModel= Backbone.Model.extend({
  defaults : {
    myModel:undefined,
  }
});
Run Code Online (Sandbox Code Playgroud)

它也有一个属性名称'myModel'.现在,如果我创建MyModel的实例:

aModel = new MyModel();

嵌套模型将在MyModel的initialize方法中设置.然后我在两个步骤中使用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);
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到了MyModel的JSON表示,它的属性是MyNestedModel.我使用默认值时会出现问题,例如:

MyModel= Backbone.Model.extend({
      defaults : {
        new MyNestedModel(),
      }
    });
Run Code Online (Sandbox Code Playgroud)

这会导致JSON.stringify出现问题,因为它不支持循环引用.我假设正在创建循环引用,因为MyModel的所有实例共享MyNestedModel的相同实例.而initialize方法为每个实例创建一个新的嵌套模型.

问题:

  1. 我对defaults:{}这个问题的"原因"的理解是否正确?
  2. 根据我最近发布的一个问题,我得到的印象是我应该使用所有属性的默认值.如果是这种情况,我应该如何在本帖子/问题中提供的场景中使用默认值?
  3. 有人可以澄清defaults:{} 关于值何时应用,何时被覆盖以及实例是否共享相同的默认"实例" 的用法?

dri*_*hev 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 });
Run Code Online (Sandbox Code Playgroud)

现在,使用toJSON调用时,您的两个模型将打印出来

{
   rating: 2,
   name: 'jack',
   email: 'jack@gmail.com'
}
{
   rating: 0,
   name: 'john',
   email: 'john@gmail.com'
}
Run Code Online (Sandbox Code Playgroud)

由于默认值是一个对象,因此您放置的每个值都会立即进行评估,因此:

defaults : {
    rating : defaultRating()
}
Run Code Online (Sandbox Code Playgroud)

将调用defaultRating() - 不是每次初始化模型时,而是立即(在extend方法中)

您应该在模型创建时需要一些数据的模型使用默认值(例如new myModel())

在您的示例中,您有以下错误:

1.设置没有属性的值

 defaults : {
      PROPERTY : new Model() 
 }
Run Code Online (Sandbox Code Playgroud)

2.您的默认设置不需要这样的选项 - 您应该只为模型放置属性(数据)

默认值始终适用,只要它不被扩展模型中的新默认值替换即可

 var Model = Backbone.Model.extend({ defaults : { alpha : 'beta' } });
 var myModel = Model.extend({ defaults : { beta : 'gama' } });
Run Code Online (Sandbox Code Playgroud)

现在你的myModel在初始化时会有

 { beta : 'gama' } // alpha : 'beta' will not be set as value, because it is replaced
Run Code Online (Sandbox Code Playgroud)