在我目前的项目中,我正在使用ampersand.js模型和rest-collections。当我把它连接到api时,我遇到了麻烦。 api返回一个像这样的对象......
{
type: ...,
multi: ...,
data: <good stuff>
}
为了将数据加载到模型或集合中,我理解我需要使用解析。
在浏览文档之后,似乎我应该在模型中进行解析。
实际上,当我对集合运行fetch时,它不会将数据加载到模型中,除非parse属性在集合上。但是,当我运行getOrFetch时,它将不会加载数据,除非parse属性在模型上。
如果我在模型和集合中都进行解析,那么无效。
我应该移动它真的没有意义。我需要知道它应该在哪里生活,以及我需要做些什么才能使它发挥作用。
以下是我的模特和收藏品:
var Case = Model.extend({
ajaxConfig: function () {
return {
headers: {
'x-auth-token': 'testing'
}
};
},
parse: function (response) {
return response.data;
},
props: {
id: 'string',
orgId: 'string',
created: 'string',
lastUpdated: 'string',
}
});
var CaseCollection = RestCollection.extend({
model: Case,
url: '/cases',
ajaxConfig: function () {
return {
headers: {
'x-auth-token': 'testing'
}
};
},
parse: function (response) {
return response.data;
},
getCase: function (caseId, callbackfunc) {
this.getOrFetch(caseId, function (err, model) {
if (err) {
console.log(err);
} else {
callbackfunc(model.toJSON());
}
});
},
getCases: function (callbackfunc) {
this.fetch({
success: function (collection, response) {
callbackfunc(collection.toJSON());
}
});
}
});
答案 0 :(得分:0)
那么,这取决于资源的数据结构;
如果预期数据是一个对象数组,即客户端请求列表,则应覆盖该集合的parse
。如果资源以对象响应,即客户请求单个项,则您将覆盖模型的parse
。
根据您的情况 - 资源返回一个对象列表,因此覆盖集合parse
以遍历响应数据并返回相关值。
如果响应数组中的对象与模型的结构匹配,则不应覆盖模型parse
,以免干扰模型的构造。< / p>
&符号getOrFetch
不应受此影响,因为它只缓存现有数据,或从预期资源中提取模型。
问题可能出在您的服务器(REST)API中。 Backbone通过将模型的url
附加到URL作为另一个段来从集合的id
中获取模型的资源,因此除非你的后端没有&#39; t在/cases/{id}
处提供任何内容,与模板绑定的模型上的任何提取都将失败。
要解决此问题,请通过覆盖rootUrl
更改模型的网址,或在后端创建此类资源。
来自model.url
上的Backbone文档:
返回模型资源所在的相对URL 在服务器上。如果您的模型位于其他位置,请覆盖 这种方法具有正确的逻辑。生成表单的URL: &#34; [collection.url] / [ID]&#34;默认情况下,您可以通过指定覆盖 如果不应该使用模型的集合,那么这是一个明确的urlRoot 帐户。