#json #angular #typescript
Вопрос:
У меня в приложении angular есть компонент с таблицей, который получает определение столбца с данными с сервера. В определениях столбца базы данных хранятся в jsonb. Класс в приложении angular имеет следующее определение:
export class Table {
id: number;
name: string;
columnsDefinition: ColumnDefinition[];
}
export class ColumnDefinition {
key: string;
title: string;
sortOrder: NzTableSortOrder | null;
sortFn: NzTableSortFn | null; // store function for sorting column
sortFnString: string; // this is function in string that i get from db
}
Какую функцию я должен использовать для приведения строки к типу NzTableSortOrder?
Я пытался (просто набросок)
tables.pipe(
map(tables => {
tables.map(t => {
t.columnsDefinition.map(definition => {
definition.sortOrder = JSON.parse(definition.sortFnString)
})
})
}))
Но есть исключение «Неожиданный токен ( в JSON»
В примерах типа библиотеки NzTableSortFn имеет следующее определение:
sortFn: (a: DataItem, b: DataItem) => a.name.localCompare(b.name) // for sort by name
Или, может быть, я могу хранить функции в json сразу, не приводя их из строки
Комментарии:
1. Боюсь, что JSON на самом деле не поддерживает функции..?
2. Каково содержание definition.sortFnString, возвращенного из значения трассировки API, в нем перед анализом, затем введите его здесь, чтобы дважды проверить, является ли он допустимым форматом json
Ответ №1:
Хранение функций в БД может быть опасным, и существуют некоторые ограничения. Однако вы можете это сделать. Например, вы можете сохранить функцию сравнения в виде строки "(a, b) => a > b"
и преобразовать строку в функцию с помощью eval: eval("(a, b) => a > b")