ViewChild 如何在 Angular 和 Storybook 中工作?

Posted

技术标签:

【中文标题】ViewChild 如何在 Angular 和 Storybook 中工作?【英文标题】:How does ViewChild work in Angular with Storybook? 【发布时间】:2021-05-06 07:51:10 【问题描述】:

我有一个名为 inline-help 的组件。组件的模板是这样的:

<div class="inline-help" #helpBlock>
      <div class="help-icon" (mouseover)="handleMouseOver($event)" (mouseout)="handleMouseOut()">
        <i class="icon-help"></i>
      </div>
      <div #helptext class="inline-help-text text-left" [class.inline-help-visible]="visible">
        <ng-content select="help-title" class="help-title"></ng-content>
        <ng-content select="help-body" class="help-body"></ng-content>
      </div>
</div>

这个组件可以像这样使用(并且正常工作):

<inline-help>
    <help-title>This is the title</help-title>
    <help-body>This is the body</help-body>
</inline-help>

但是,这在 InlineHelp.stories.ts 文件中不起作用:

export default 
  title: 'Library/Inline-help',
  component: InlineHelpComponent,
  decorators: [
    moduleMetadata(
      declarations: [InlineHelpComponent],
      imports: [CommonModule],
    ),
  ],
 as Meta;

const Template: Story<InlineHelpComponent> = (args: InlineHelpComponent) => (
  component: InlineHelpComponent,
  props: args,
  template: `
 <inline-help>
  <help-title>my title</help-title>
  <help-body>my help body</help-body>
 <inline-help>
  `,
);

export const InlineHelp = Template.bind();

我收到此错误:

Template parse errors:
'help-title' is not a known element:
1. If 'help-title' is an Angular component, then verify that it is part of this module.
2. If 'help-title' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.

我不完全确定如何在这里渲染传入的内容。

【问题讨论】:

【参考方案1】:

您必须在故事的moduleMetadata 部分的declarations 下包含您在故事中使用的所有组件。 这可能如下所示:

export default 
  title: 'Library/Inline-help',
  component: InlineHelpComponent,
  decorators: [
    moduleMetadata(
      declarations: [InlineHelpComponent, HelpTitleComponent, HelpBodyComponent],
      imports: [CommonModule],
    ),
  ],
 as Meta;

(假设 help-title 和 help-body 的组件名称是 HelpTitleComponentHelpBodyComponent

【讨论】:

以上是关于ViewChild 如何在 Angular 和 Storybook 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在 Angular 8 中为 @ViewChild 使用新的静态选项?

如何在 Angular 中使用多个 ViewChild 元素 (2/4)

Angular 在项目中学习@ViewChild和ElementRef的使用

Angular 2+:获取@ViewChild() 的子元素

viewChild如何获取angular2中用js添加的元素?

Angular : 你真的懂@ViewChild吗