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 的初始化方法中设置。然后我在两步过程中使用 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 调用您的两个模型时,将打印

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

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

defaults : {
    rating : defaultRating()
}

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

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

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

1.设置一个没有属性的值

 defaults : {
      PROPERTY : new Model() 
 }

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

默认值始终适用,只要它没有被扩展模型中的新默认值替换,例如

 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 回答