在我当前的项目中,我使用了ampersand.js模型和rest集合。当我将它连接到api时,我遇到了麻烦。api返回的对象如下所示...
{
type: ...,
multi: ...,
data: <good stuff>
}为了将数据加载到模型或集合中,我的理解是我需要使用parse。
在看完文档之后,似乎我应该在模型中放置parse。
但在实践中,当我对集合运行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());
}
});
}
});发布于 2015-07-11 21:32:04
这取决于资源的数据结构;
如果期望的数据是一个对象数组,即客户端请求一个列表,那么您应该覆盖集合的parse。如果资源使用对象进行响应,即客户端请求单个项,则应覆盖模型的parse。
根据您的情况-资源返回一个对象列表,因此覆盖集合的parse以遍历响应数据并返回相关值。
假设响应数组中的对象与模型的结构相匹配,就不应该覆盖模型的parse,以免干扰模型的构造。
Ampersand的getOrFetch不应该受此影响,因为它只缓存现有数据,或者从预期的资源中获取模型。
问题可能出在服务器的(REST) API中。Backbone从集合的url中派生模型的资源,方法是将模型的id作为另一个段附加到URL,因此除非您的后端不提供/cases/{id}中的任何内容,否则在绑定到集合的模型上的任何获取都将失败。
要解决这个问题,要么通过覆盖rootUrl来更改模型的URL,要么在后台创建这样的资源。
来自model.url上的主干文档
返回模型资源在服务器上的相对地址。如果您的模型位于其他位置,请使用正确的逻辑覆盖此方法。默认情况下会生成以下形式的urlRoot:“集合.url/id”,但如果不应考虑模型的集合,则可以通过指定显式URL来覆盖。
https://stackoverflow.com/questions/31302655
复制相似问题