Передать коллекцию в пользовательскую угловую схему?

Я хочу создать собственную угловую схему, которая может принимать коллекцию имен действий. Затем я сгенерирую 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Значение в схеме не приведет к сбою схемы, если вы не предоставите никаких аргументов. Вам нужно будет выполнить проверку этого свойства в вашей схеме.

Другие вопросы по тегам