Ember.js - 不确定如何建模数据
Ember.js - Not sure how to model data
我正在使用来自 Ember 数据的 RESTAdapter 来处理 JSON 负载。部分有效载荷包含
等数据
"links": {
"facebook": "http://www.facebook.com/dailypuppy",
"twitter": "http://twitter.com/dailypuppy",
"officialWebsite": "http://www.dailypuppy.com/"
},
我不太确定如何对数据建模。我注意到 RESTSerializer 有一个 normalizePayload
函数,所以我想我应该尝试一下而不是 RESTAdapter。我是这样用的
normalizePayload: function(payload) {
payload.facebookUrl = payload.links.facebook;
payload.twitterUrl = payload.links.twitter;
payload.mySpaceUrl = payload.links.myspace;
payload.officialWebsiteUrl = payload.links.officialWebsite;
delete payload.links;
return payload;
}
这种方法的问题是 RESTSerializer 不支持我所依赖的 findQuery
方法。我收到一条错误消息 tried to load a query but your adapter does not implement findQuery
如有任何帮助,我们将不胜感激。
根据您的描述,我认为您误将序列化程序用作(读取:代替)适配器。这行不通。不要这样做。万恶将降临。
您只描述了部分有效负载,因此我假设这是 json 数据对象的一部分,在其他方面都符合 RESTAdapter and RESTSerializer 的预期。
现在,如图所示覆盖 normalizePayload 应该可行,但是您不使用 RESTSerializer 而不是 RESTAdapter。您将序列化程序 替换为 RESTAdapter 中的内容。如果您(使用 ember-cli
)生成一个应用程序适配器 (ember g adapter application
),您可以像这样为您的 RESTAdapter 自定义序列化程序 (app/adapters/application.js
):
import DS from 'ember-data';
export default DS.RESTAdapter.extend({
serializer: DS.RESTSerializer.create({
normalizePayload: function(payload) {
function doNormalize(payload) {
payload.facebookUrl = payload.links.facebook;
payload.twitterUrl = payload.links.twitter;
payload.mySpaceUrl = payload.links.myspace;
payload.officialWebsiteUrl = payload.links.officialWebsite;
delete payload.links;
return payload;
}
// Change 'attractions' with other payloads here
if(Array.isArray(payload.attractions)) {
payload.attractions = payload.attractions.map(doNormalize);
return payload;
} else {
return doNormalize(payload);
}
}
})
});
(代码未经测试,但应该能说明思路)
因为可能并非所有有效负载都包含此 links
属性,您可能只想为特殊的 thing
自定义适配器 - 只需替换 application
和 thing
在我上面写的所有内容中,你已经有了专门的 thing
适配器。所有不是 thing
的东西都将继续使用默认的应用程序适配器。
我正在使用来自 Ember 数据的 RESTAdapter 来处理 JSON 负载。部分有效载荷包含
等数据"links": {
"facebook": "http://www.facebook.com/dailypuppy",
"twitter": "http://twitter.com/dailypuppy",
"officialWebsite": "http://www.dailypuppy.com/"
},
我不太确定如何对数据建模。我注意到 RESTSerializer 有一个 normalizePayload
函数,所以我想我应该尝试一下而不是 RESTAdapter。我是这样用的
normalizePayload: function(payload) {
payload.facebookUrl = payload.links.facebook;
payload.twitterUrl = payload.links.twitter;
payload.mySpaceUrl = payload.links.myspace;
payload.officialWebsiteUrl = payload.links.officialWebsite;
delete payload.links;
return payload;
}
这种方法的问题是 RESTSerializer 不支持我所依赖的 findQuery
方法。我收到一条错误消息 tried to load a query but your adapter does not implement findQuery
如有任何帮助,我们将不胜感激。
根据您的描述,我认为您误将序列化程序用作(读取:代替)适配器。这行不通。不要这样做。万恶将降临。
您只描述了部分有效负载,因此我假设这是 json 数据对象的一部分,在其他方面都符合 RESTAdapter and RESTSerializer 的预期。
现在,如图所示覆盖 normalizePayload 应该可行,但是您不使用 RESTSerializer 而不是 RESTAdapter。您将序列化程序 替换为 RESTAdapter 中的内容。如果您(使用 ember-cli
)生成一个应用程序适配器 (ember g adapter application
),您可以像这样为您的 RESTAdapter 自定义序列化程序 (app/adapters/application.js
):
import DS from 'ember-data';
export default DS.RESTAdapter.extend({
serializer: DS.RESTSerializer.create({
normalizePayload: function(payload) {
function doNormalize(payload) {
payload.facebookUrl = payload.links.facebook;
payload.twitterUrl = payload.links.twitter;
payload.mySpaceUrl = payload.links.myspace;
payload.officialWebsiteUrl = payload.links.officialWebsite;
delete payload.links;
return payload;
}
// Change 'attractions' with other payloads here
if(Array.isArray(payload.attractions)) {
payload.attractions = payload.attractions.map(doNormalize);
return payload;
} else {
return doNormalize(payload);
}
}
})
});
(代码未经测试,但应该能说明思路)
因为可能并非所有有效负载都包含此 links
属性,您可能只想为特殊的 thing
自定义适配器 - 只需替换 application
和 thing
在我上面写的所有内容中,你已经有了专门的 thing
适配器。所有不是 thing
的东西都将继续使用默认的应用程序适配器。