将集合传递到自定义角度示意图中?

时间:2019-01-28 21:33:12

标签: angular-schematics

我想创建一个可以接受动作名称集合的自定义角度示意图。然后,我将为用户提供的每个动作名称生成3个ngrx动作。

例如,我想创建一个可以像这样调用的原理图:

ng g my-collection:my-schematic --actions=GetById,GetByFirstName

然后,我将为GetById,GetByIdSuccess,GetByIdError,GetByFirstName,GetByFirstNameSuccess,GetByFirstNameError生成代码。

问题是我只看到了将单个值作为输入参数的角度示意图。有谁知道如何在自定义角度示意图中处理集合?

4 个答案:

答案 0 :(得分:0)

您可以关注此博客,它将教您如何创建自己的原理图项目:

https://blog.angular.io/schematics-an-introduction-dc1dfbc2a2b2

在文件collection.json中生成原理图项目后,可以扩展@ngrx/schematics

{
...
"extends": ["@ngrx/schematics"],
}

,然后使用ngrx原理图生成以下3个动作:

externalSchematic('@ngrx/schematics', 'action')

答案 1 :(得分:0)

我还没有找到如何将字符串数组转换为逻辑示意图参数的好例子,但是我找到了一种解决方法。我所做的是有一个简单的字符串输入参数,该参数始终被定界(我使用来定界值)。这是我的架构:

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));

如果您知道处理这些问题的更好方法,请分享。谢谢!

答案 2 :(得分:0)

您需要多次通过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[]
}

答案 3 :(得分:0)

如果您想直接从命令参数中提取它们,您可以执行以下操作:

{
  "$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 值不会导致原理图失败。您需要在原理图中对该属性进行验证。