javascript - model.toJSON() 返回空对象

标签 javascript backbone.js

我一直在使用 Backbone.js 并遇到了一些意想不到的事情。如果我显式设置属性,则 toJSON() (以及属性的结果)似乎只会返回 JSON 对象。问题是这样的:

  1. 使用一些数据扩展/继承示例对象
  2. 获取生成的构造函数
  3. 实例化/新建一个实例
  4. 调用toJSON()函数

我希望该调用返回包含所有属性(继承和绑定(bind))的对象,但结果却返回一个空的 {} 对象。

这是示例代码:

var TestModelConstructor = Backbone.Model.extend({ name: "test", num: 483 });
var testinstance = new TestModelConstructor;

console.log(testinstance.name); //prints: test
console.log(testinstance.num);  //prints: 483
console.log(JSON.stringify(testinstance.toJSON())); //prints: {}
console.log(testinstance.attributes); //again empty object

testinstance.newattr = "adding new attribute";
console.log(testinstance.attributes); //{}  ????

//either set explicitly by calling "set" or via constructor/initialize
testinstance.set({ label: "i can setz attributez" });
console.log(JSON.stringify(testinstance.toJSON())); 
                                      //{"label":"i can setz attributez"}
console.log(testinstance.attributes); //{"label":"i can setz attributez"}

要么这种行为很奇怪,要么我错过了文档中的某些内容。

最佳答案

我认为您应该使用 extend 函数的 defaults 参数来设置默认值。传递给扩展函数的参数将是类的成员而不是属性,这就是 toJSON 使用的。

var TestModelConstructor = Backbone.Model.extend({
    defaults : { name: "test", num: 483 }
});
var testinstance = new TestModelConstructor;
....

请参阅defaults documentation了解更多详情。

需要明确的是,Backbone.Model 使用的属性存储在类的 attributes 成员中,而不是存储在实际的类本身上。这可以避免将实际模型数据与您在模型上调用的函数以及用于配置模型的设置混淆。当您将参数传递给 Model.extend 函数时,您将创建/设置这些函数和设置。

因此,当您尝试设置 testinstance.newattr 时,您实际上应该使用 testinstance.attributes.newattr 。这就是 .set 方法在幕后实际执行的操作,因此我建议仅使用 .set

同样,attributes documentation有更多详细信息

关于javascript - model.toJSON() 返回空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605991/

相关文章:

javascript - 使用 javascript 从 html 背景图像到 "link"?

javascript - 正确实现 Backbone 比较器

javascript - Backbonejs 确定哪个函数将响应从模型返回到 View

javascript - 主干历史推送状态到 hashtag IE9

javascript - 主干 - 复制粘贴网址

c# - 调用 javascript 函数 && 处理事件

javascript - 读取 BreezeJS 中的 odata 链接

javascript - onsubmit 验证所有函数返回真

javascript - 禁用具有多个输入的按钮

javascript - View 未使用 require.js 文本呈现!插入