【问题标题】:Backbone.js - Using new() in Model defaults - circular referenceBackbone.js - 在模型默认值中使用 new() - 循环引用
【发布时间】:2012-04-08 05:14:51
【问题描述】:

采用以下模型:

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. 我对@9​​87654326@ 的理解是 问题正确吗?
  2. From a question I posted recently我得到了 印象我应该为所有属性使用默认值。如果是这样 在这种情况下,我应该如何在呈现的场景中使用默认值 在这个帖子/问题中?
  3. 谁能澄清defaults:{}的用法 关于值何时应用,何时被覆盖和 实例是否共享相同的默认“实例”?

【问题讨论】:

    标签: backbone.js


    【解决方案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 是一个对象,因此您放置的每个值都会立即进行评估:

    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
    

    【讨论】:

    • 太棒了!这是完全不直观的。我在做"subItems: []",甚至搞砸了。谢谢你。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多