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

2019-09-16 10:25发布

采取以下型号:

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 =新为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);

这工作得很好,我得到为MyModel的JSON表示,它的MyNestedModel的财产。 当我使用默认设置,例如出现该问题:

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

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

问题:

  1. 是我的理解defaults:{}是问题正确的“事业”?
  2. 从一个问题,我最近公布的我得到了我应该使用默认值,所有属性的印象。 如果是这样的话,我应该如何在这个岗位/问题提出的方案中使用默认值?
  3. 有人可以明确使用defaults:{}与问候,当值适用,当它覆盖到是否实例共享相同的默认“实例”?

Answer 1:

默认值仅用于模型中的属性(在模型中的数据),而当你创建你的模型需要从默认值,并设置属性。 例如

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称为将打印

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

由于默认值是一个对象,每一个珍惜你地方有评估立刻让:

defaults : {
    rating : defaultRating()
}

将调用defaultRating() - 不是每次当你初始化模式,但立即(在扩展方法)

您应该使用,你需要一些数据对模型的创建模式存在违约(如新的基于myModel())

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

1.设置一个值,而不属性

 defaults : {
      PROPERTY : new Model() 
 }

2.you不需要为您的默认值,例如一个选择 - 你应该把那里只有属性(数据)模型

默认值,只要它没有被替换总是通过应用新的默认设置中的扩展模型如

 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


文章来源: Backbone.js - Using new() in Model defaults - circular reference
标签: backbone.js