Хорошо, я думаю, что вам нужно будет сделать некоторые манипуляции с вашими данными, прежде чем вы сможете отобразить их в своей базе данных.
В ваших component.ts, во-первых, вы должны определить ваши столбцы.
tableColumns = [
{
prop: 'name',
name: 'Name'
},
{
prop: 'gender',
name: 'Gender'
},
{
prop: 'company',
name: 'Company'
},
{
prop: 'topingsId',
name: 'Topings ID'
},
{
prop: 'topingsName',
name: 'Topings Name'
}
]
Затем вы должны попытаться «сгладить» ваши данные так, чтобы они представляли собой массив одноуровневых объектов (вместо того, чтобы их вкладывать).
this.rows = [
{
name: 'Austin', gender: 'Male', company: 'Swimlane', topings:[{ id:'101',name:'spinach'}]
},
{
name: 'Dany', gender: 'Male', company: 'KFC',topings:[{ id:'102',name:'onion'}]
},
{
name: 'Molly', gender: 'Female', company: 'Burger King' ,topings:[{ id:'103',name:'ginger'}]
}
];
this.rows = this.rows.map(row => ({
name: row['name'],
gender: row['gender'],
company: row['company'],
topingsId: row['topings'][0]['id'],
topingsName: row['topings'][0]['name']
}));
console.log(this.rows);
И последнее, но не менее важное: в вашем component.html вы можете сделать так, чтобы ваши данные были такими:
<ngx-datatable class="material" [rows]="rows" [columns]="tableColumns"....></ngx-datatable>
И не забудьте определить другие свойства, которые понадобятся вашей таблице.
Дополнительные способы назначения данных строк с использованием некоторой магии ES6.
1) Использование синтаксиса Spread :
this.rows = this.rows.map(row => ({
...row,
topingsId: row['topings'][0]['id'],
topingsName: row['topings'][0]['name']
}));
2) Использование синтаксиса распространения и разрушения объектов :
this.rows = this.rows.map(row => {
const {topings, ...others} = row;
return {
...others,
topingsId: row['topings'][0]['id'],
topingsName: row['topings'][0]['name']
};
});
И чтобы ответить на ваш вопрос о комментариях, наши строки данных и столбцы являются динамическими, мы должны принять немного другую стратегию.
Во-первых, мы сравним ваши данные с массивом неопубликованных объектов. Мы получаем массив значений для каждой строки, а затем преобразуем массив в объект. После чего мы используем синтаксис распространения, чтобы объединить все в один объект, который представляет строку в this.rows
.
Обратите внимание, что мы используем Вычисляемые имена свойств (еще одна особенность ES6), чтобы предоставить ключ динамического свойства каждой вершины.
this.rows = this.rows.map(row => {
const {topings, ...others} = row;
const topingsList = topings.map((toping, index) => ({
['toping' + Number(index + 1) + ' Name']: toping['name']
}));
topingsObject = Object.assign({}, ...topingsList);
return {
...others,
...topingsObject
}
});
Далее, из данных строк мы должны собрать массив новых столбцов, который является одним из обязательных свойств ngx-datatable. Во-первых, наш this.tableColumns
определяется так:
tableColumns = [
{
prop: 'name',
name: 'Name'
},
{
prop: 'gender',
name: 'Gender'
},
{
prop: 'company',
name: 'Company'
}
];
И сразу после получения сглаженного this.rows
мы получим массив свойств, доступных в данных строки. Оттуда мы обновляем tableColumns
динамическими наполнителями (например, имя Toping1, имя Toping2, ..etc)
this.rows = this.rows.map(row => { .....}) // continued from the above
const headerNames = Object.keys(Object.assign({}, ...this.rows));
headerNames.map(header => {
if (header!=='name' && header!=='gender' && header!=='company') {
this.tableColumns.push({
prop: header,
name: header
});
}
});