【发布时间】:2015-09-19 23:01:10
【问题描述】:
下面是我从 REST 端点获取的 JSON 示例。我需要从subcategories 数组创建一个树状结构,如您所见,它是递归嵌套的。
我搜索并尝试了将近一周,但无法提出一个完全有效的解决方案 - 到目前为止,我得到的最好的结果是子类别既作为其父子类别的子类别出现(根据需要),但也作为普通的顶级节点,我显然不想要。
我的问题很简单:我该如何建模,以便 ember.js 能够创建所需的树状结构?
我认为这对于有经验的 ember 用户来说并不难,但与往常一样, ember 的文档既不是最新的,也没有涵盖更多琐碎的概念。
无论我在哪里看,这种嵌套结构的概念似乎都是陌生的(我发现的所有嵌套都具有不同的类型,但这正是我不需要的)。 JSON 格式是不可变的,我必须按原样使用它。
我创建了我的项目 - ember-cli 0.2.7 - ember.js 1.13.0 - 余烬数据 1.13.4 使用 DS.RESTAdapter 和 DS.RESTSerializer
{
"id": 28,
"hassubcategories": true,
"CategoryName": "By Asset Type",
"subcategories": [
{
"id": 29,
"CategoryName": "Images",
"hassubcategories": true,
"subcategories": [
{
"id": 30,
"CategoryName": "Illustrations",
"hassubcategories": false
},
{
"id": 31,
"CategoryName": "Pictures",
"hassubcategories": true,
"subcategories": [
{
"id": 61,
"CategoryName": "BMP",
"hassubcategories": false
},
{
"id": 32,
"CategoryName": "EPS",
"hassubcategories": false
}
]
}
]
},
{
"id": 73,
"CategoryName": "InDesign (related)",
"hassubcategories": false
}
]
}
这应该在模板中呈现为树状列表 图片 - 插图 -- BMP -- 每股收益 设计(相关)
感谢您的帮助。
编辑 2015-07-17: 我仍然没有接近动态解决方案,但目前(谢天谢地,级别仅限于两个)我很高兴创建一个 子类别模型和侧载。 我遍历有效载荷,获取每个子类别(第 2 级)的 id 并将该子类别移动到列表中。 我的序列化程序子类别:
import DS from 'ember-data';
import ember from 'ember';
export default DS.RESTSerializer.extend({
isNewSerializerAPI: true,
primaryKey: 'id',
normalizeHash: {
subcategories: function(hash) {
if(ember.get(hash, 'hassubcategories') && !ember.isEmpty(ember.get(hash, 'subcategories'))) {
var ids = [];
ember.get(hash, 'subcategories').forEach(function(cat){
ids.push(ember.get(cat, 'id'));
});
hash.children = ids;
}
return hash;
}
},
extractMeta: function(store, type, payload) {
if (payload && payload.subcategories) {
var subs = [];
var subs2 = [];
payload.subcategories.forEach(function(cat){
if(cat['hassubcategories']) {
var subsubs = cat['subcategories'];
subs.addObject(cat);
subs2.addObjects(subsubs);
} else {
subs.addObject(cat);
}
});
payload.subcategories = subs;
payload.subsubcategories = subs2;
}
delete payload.id; // keeps ember data from trying to parse "id" as a record (subcategory)
delete payload.hassubcategories; // keeps ember data from trying to parse "hassubcategories" as a record (subcategory)
delete payload.CategoryName; // keeps ember data from trying to parse "CategoryName" as a record (subcategory)
delete payload.ParentID; // keeps ember data from trying to parse "ParentID" as a record (subcategory)
}
});
和模型 子类别:
import DS from 'ember-data';
export default DS.Model.extend({
CategoryName: DS.attr('string'),
hassubcategories: DS.attr('boolean'),
children: DS.hasMany('subsubcategories', {async: false })
});
子子类别:
import DS from 'ember-data';
export default DS.Model.extend({
CategoryName: DS.attr('string'),
hassubcategories: DS.attr('boolean'),
});
也许它对某人有帮助,也许我什至得到了如何真正动态地实现它的提示。
【问题讨论】:
标签: javascript json rest recursion ember.js