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

2024-06-22

采用以下模型:

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);

这工作正常,我得到了模型的 JSON 表示形式及其嵌套模型的属性。当我使用默认值时会出现问题,例如:

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

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

问题:

  1. 我的理解是defaults:{}是的“原因” 问题正确吗?
  2. 来自我最近发布的一个问题 https://stackoverflow.com/questions/10040128/backbone-js-model-property-constants-is-this-good-practice/10050603#10050603我拿到 印象我应该对所有属性使用默认值。如果那是 在这种情况下,我应该如何在所呈现的场景中使用默认值 在这篇文章/问题中?
  3. 有人可以澄清一下使用defaults:{}关于该值何时适用、何时被覆盖以及 实例是否共享相同的默认“实例”?

默认值仅用于模型内的属性(模型中的数据),每当您创建模型时,它都会从默认值中获取值并设置属性。例如

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

User1 = new User({ name : 'jack', email : '[email protected] /cdn-cgi/l/email-protection' });
User2 = new User({ name : 'john', email : '[email protected] /cdn-cgi/l/email-protection' });

User1.set({ rating : 2 });

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

{
   rating: 2,
   name: 'jack',
   email: '[email protected] /cdn-cgi/l/email-protection'
}
{
   rating: 0,
   name: 'john',
   email: '[email protected] /cdn-cgi/l/email-protection'
}

由于 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Backbone.js - 在模型默认值中使用 new() - 循环引用 的相关文章

  • 使用 Rivets.js 迭代 Backbone.js 模型的集合?

    我在用着铆钉 js http rivetsjs com 对于 Backbone 项目中的两个双向数据绑定 并且希望实现迭代绑定 文档表明迭代绑定是可能的 但没有可用的示例 我正在使用一个简单的 Rails API 将 JSON 发送到客户端
  • 渐进增强 - Node.js、Backbone.js

    Node js 服务器有两个角色 前缀为 api 的路由上的 RESTFul API 在其他路线上呈现网站页面 plans features terms 目前 我的所有页面都会呈现一个 正在加载页面 并与 Backbone router 启
  • 每次分页获取后将数据附加到同一集合

    我正在尝试使用主干填充 Instagram 图像 我基本上有以下3个模型 用户模型存储与 Instagram 相关的所有用户信息 App Models User Backbone Model extend defaults id acces
  • Backbone-relational 无法实例化两个 RelationalModel 对象

    我正在尝试实现 BackboneRelational 并不断获得 无法实例化多个 Backbone RelationalModel 每种类型都有相同的 ID class App Models User extends Backbone Re
  • 主干集合排序

    我制作了我的第一个主干应用程序 但在集合排序方面遇到了一些问题 使用这个后 var SortedFriends MyFriends sortBy function friend return friend get uid console l
  • 如何重载比较器以使用 UTF-8 和不同区域设置进行排序

    我有一个数据集合 Alphabet Zend wiczenia 结果collection sort I get Alphabet Zend wiczenia 如何超载comparator使用 UTF 8 和不同的语言环境进行排序 你需要设置
  • 主干关系事件未触发?

    class TheModel extends Backbone RelationalModel relations type Backbone HasMany key subModels relatedModel SubModel coll
  • Marionette CompositeView 为 Collection 中的每个模型呈现自身,而不是 ItemView (Marionette Rails)

    基本上 我试图将 CompositeView 渲染为带有表头的简单四列列表 其中集合中的每个模型都渲染为 并附加到 我正在跟进德里克的一个例子 http jsfiddle net derickbailey me4NK 非常接近 只有一点点变
  • 如何检查侧边栏视图是否已经在主干中渲染?

    通常 用户通过主页进入网站 然后我在那里渲染侧边栏视图 接下来 用户单击链接 路由器呈现另一个视图并替换原始内容视图 侧边栏视图不会重新渲染 当用户在子页面上单击刷新时 侧边栏不会呈现 如何检查视图是否存在并且已渲染 划分责任并坚持下去 不
  • 使用 Backbone.js 和 Rivets.js 的简单示例

    我正在寻找一个非常简单的例子 例如之间存在双向绑定span文本和一个input使用 Backbone js 的元素和铆钉 js http rivetsjs com 也许 Rivets js 文档中有一个 但我找不到它 有什么帮助吗 假设您的
  • toJSON() 和 JSON.Stringify() 之间的区别

    如果您需要读取或克隆模型的所有数据属性 请使用其 toJSON 方法 此方法返回属性的副本作为 对象 尽管有其名称 但不是 JSON 字符串 当 JSON stringify 为 使用 toJSON 方法传递一个对象 它将返回的字符串化 t
  • 使用 Node.js 的前端 javascript 框架 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Backbone:仅当事件侦听器尚不存在时才添加

    换句话说 如何找到已收听的事件列表 我正在使用 Backbone on 和 Backbone trigger 在两个彼此不了解的视图之间进行通信 但是 添加侦听器的视图实际上是一个 项目视图 一个集合 所以我添加了许多侦听器 因此我想首先检
  • 主干视图 DOM 元素已删除

    我一直在阅读有关 Backbone js 僵尸 或内存泄漏 问题的信息 基本上 当您不再需要该元素时 您必须从 DOM 中解除绑定并删除该元素 以确保所有事件也被删除 现在 我有一个包含几个容器的单页应用程序 div div div div
  • 如何部署连接Django RESTful API的静态网站?

    首先 谷歌或SO搜索对我没有帮助 很多关于django静态文件的提示 我认为这些提示与这里无关 我继承了一个项目 其中包括 Django 后端以 API 形式仅返回 JSON 响应 标准 Swampdragon 部署将实时更新推送到前端 这
  • Backbone.js - 自定义设置器

    想象一个简单的骨干模型 例如 window model Backbone Model extend defaults name date new Date valueOf 我正在尝试找到一种方法 使模型始终以小写形式存储名称 而不管提供的输
  • 更改主干模板时,Chrome不会刷新本地文件

    我正在 Google Chrome v19 0 1084 56 上开发主干应用程序 当我处理模板时 我 在 Mac OSX Lion 上 和另一位开发人员 在 Fedora 上 都必须关闭选项卡并重新打开文件看到新的变化 强制刷新 cmd
  • 使用 Backbone.js 时是否必须使用后端?

    我想开发一个相对简单的应用程序 根据多个输入计算一些值 我不需要后端 所有计算都可以在浏览器中完成 我对 JavaScript 和 Web 应用程序有点陌生 我遇到了骨干网 js http documentcloud github com
  • 如何使用主干在集合和模型中创建动态 url

    我的收藏和模型是这样的 detail userid 0 detail contactid 0 var ContactDetail Backbone Model extend urlRoot URL CONTACTS1 detail user
  • Ripple - 未捕获错误:模块加载超时:app http://requirejs.org/docs/errors.html#timeout

    我在我的移动应用程序项目中使用 jquery backbone js underscore js 和 bootstrap 3 我在波纹中运行我的应用程序 有时我的控制台中会出现这个愚蠢的错误 Uncaught Error Load time

随机推荐