backbone.js 模型和集合开销
-
11-12-2019 - |
题
当我从服务器获取模型或集合时,除非我进行字符串化然后重新解析,否则我无法访问模型的属性。想必模型本身有一些来自backbone.js的额外开销?请注意,在下面的代码中,我可以顺序执行字符串化/解析,这应该给出与我开始时相同的结果。然而,显然我通过执行这两个步骤消除了一些多余的信息,因为我的模型的属性现在的暴露方式与以前不同。当然,我不需要通过这两个步骤来访问我的模型属性,对吗?
Eg.
thismodel = /// assume this came from server fetch
alert(thismodel.name); // DOES NOT WORK - undefined
jsonmodel = JSON.stringify(thismodel);
var providerprefslistJSON = jQuery.parseJSON(jsonmodel);
alert(providerprefslistJSON.name); // WORKS
解决方案
骨干模型对象不是纯旧的javascript对象。它们在内部哈希中保持其属性。要访问name
属性,您可以执行以下操作:
alert(thismodel.attributes.name);
或更好但使用 get()方法:
alert(thismodel.get("name"));
当您将模型转换为JSON时,它的原因是因为JSON.stringify
调用 the tojson()方法,它从创建一个json字符串,从内部属性hash ,含义当解析该字符串时,您得到一个纯旧的javascript对象 - 它与骨干模型对象不同。
其他提示
首先,您是否尝试访问模型或响应的属性?
从 alert(thismodel.name)
看来您要寻找模型的属性而不是属性。如果您正在寻找模型属性,那么也许您想要 alert(this.model.get('name'))
如果您确实要使用 model.name,那么基本上问题可能在于您如何解析数据。例如,来自服务器的 JSON 类似于 {'name':'Jimmy'}。
虽然 model.response
发送的原始 JSON 在 object.name 下具有“Jimmy”命名空间,Backbone 将自动采用该名称并将其转换为模型属性,除非另有说明(例如modelObj.attributes.name) 此时您将使用 get()
功能。
如果一切正常,您应该能够相当简单地访问模型数据。
例如。拿来
var model = new MyModel();
model.id = 1;
model.fetch({
success: function(model, response) {
console.log(model.get('name')); // The model name attribute
console.log(response.name); // The RAW response name property
}
});
或者您的服务器可能没有将数据作为 JSON 数据发送回。是否是服务器响应 content-type="application/json"
?
有些事情要检查。