Передать коллекцию в пользовательскую угловую схему?
Я хочу создать собственную угловую схему, которая может принимать коллекцию имен действий. Затем я сгенерирую 3 действия ngrx для каждого имени действия, предоставленного пользователем.
например, я хочу создать схему, которая может быть вызвана следующим образом:
ng g my-collection:my-schematic --actions=GetById,GetByFirstName
Затем я сгенерирую код для GetById, GetByIdSuccess, GetByIdError, GetByFirstName, GetByFirstNameSuccess, GetByFirstNameError.
Проблема в том, что я видел только угловые схемы, которые будут принимать одно значение в качестве входного параметра. Кто-нибудь знает, как обрабатывать коллекции в произвольной угловой схеме?
4 ответа
Вам необходимо пройти actions
много раз.
ng g my-collection:my-schematic --actions=GetById --actions=GetByFirstName
Определите параметр как массив в вашем schema.json
файл.
...
"actions": {
"type": "array",
"items": {
"type": "string"
},
"description": "The name of the actions."
},
...
Также в вашем schema.ts
.
export interface Schema {
actions: string[]
}
Вы можете следить за этим блогом, он научит вас, как создать собственный проект схемы:
https://blog.angular.io/schematics-an-introduction-dc1dfbc2a2b2
после создания проекта схемы в файле collection.json
Вы можете продлить @ngrx/schematics
:
{
...
"extends": ["@ngrx/schematics"],
}
а затем используйте схемы ngrx для генерации 3-х действий:
externalSchematic('@ngrx/schematics', 'action')
Я не нашел хорошего примера того, как преобразовать массив строк в параметр схемы, но я нашел обходной путь. У меня был простой строковый входной параметр, который последовательно разграничивался (я использовал для разграничения значений). Вот моя схема:
export interface Schema {
name: string;
path?: string;
project?: string;
spec?: boolean;
actions: string;
__actions: string[];
store?: string;
}
Я анализирую предоставленный параметр action и генерирую строковый массив __actions и использую это свойство в своих шаблонах. Вот фрагмент из моего index.ts:
export default function(options: ActionOptions): Rule {
return (host: Tree, context: SchematicContext) => {
options.path = getProjectPath(host, options);
const parsedPath = parseName(options.path, options.name);
options.name = parsedPath.name;
options.path = parsedPath.path;
options.__actions = options.actions.split(',');
options.__actions = options.__actions.map(_a => classify(_a));
Если вы знаете лучший способ их обработки, пожалуйста, поделитесь. Спасибо!
Если вы хотите извлечь их прямо из аргументов команды, вы можете сделать следующее:
{
"$schema": "http://json-schema.org/draft-07/schema",
"$id": "Sample",
"title": "Sample Schematic",
"type": "object",
"description": "Does stuff.",
"additionalProperties": false,
"properties": {
"things": {
"type": "array",
"items": {
"type": "string"
},
"$default": {
"$source": "argv"
},
"description": "Things from the command-line args."
}
}
}
Затем, когда вы запустите свою схему, вы можете:
schematics schematic-lib:sample stuff other-stuff more-stuff
В этом случае
things
собственность будет
['stuff', 'other-stuff', 'more-stuff']
.
Изменить: обратите внимание, что
required
Значение в схеме не приведет к сбою схемы, если вы не предоставите никаких аргументов. Вам нужно будет выполнить проверку этого свойства в вашей схеме.