angular - 在 Angular 模块中使用注入(inject)的故事书

标签 angular storybook

我想使用 Storybook 来开发和测试我的 UI 组件,并在同一项目中将它们作为 npm 库发布。这就是我将所有组件封装为一个功能模块的原因。我想创建一个简单的模块来生成一个表单并允许一些撤消功能。我的问题是 Storybook 无法将 Formbuilder 服务注入(inject)到我的组件中。

我的设置如下:

故事:

storiesOf('UndoForm', module)
  .addDecorator(
    moduleMetadata({
      imports: [ReactiveFormsModule, UndoFormModule]
    }),
  )
  .add('Testform', () => ({
    template: '<mods-undo-form></mods-undo-form>'
  })
);

UndoFormModule:

@NgModule({
  declarations: [UndoFormComponent],
  imports: [ReactiveFormsModule],
  exports: [UndoFormComponent]
})
export class UndoFormModule {}

UndoFormComponent:

@Component({
  selector: 'mods-undo-form',
  templateUrl: './undo-form.component.html',
  styleUrls: ['./undo-form.component.scss']
})
export class UndoFormComponent implements OnInit {
  [...]
  constructor(private fb: FormBuilder) { }
  [...]
}

我得到的错误是:

Can't resolve all parameters for UndoFormComponent: (?).

我发现,当我显式使用 @Inject 注释时,代码可以正常工作:

constructor(@Inject(FormBuilder) private fb: FormBuilder) { }

是否有可能阻止使用显式注释?

最佳答案

您需要在 .storybook/tsconfig.json 文件的 compilerOptions 对象中添加 "emitDecoratorMetadata": true

所以你的 .storybook/tsconfig.json 应该是这样的:

{
  "extends": "../tsconfig.app.json",
  "compilerOptions": {
    "emitDecoratorMetadata": true,   <--------- Add this!
    ...
  },
  ...
}

然后确保重新启动您的故事书进程。

关于angular - 在 Angular 模块中使用注入(inject)的故事书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56868391/

相关文章:

javascript - Angular 无法获取完整 url

javascript - Ionic 2 Tabs 超出最大调用堆栈大小

angular - 重置 react 形式会触发 Angular 6 中所有必需的验证器

storybook - 控件的嵌套对象中的 argTypes

typescript - vue类组件继承,方法来自基类 "is not a function"

angular - 数组缓冲区 : I want to play the audio from an arraybuffer using decodeAudioData in angular

Angular9 + NX + Storybook : Why are my Scss styles getting ignored in Storybook ? 没有错误

javascript - Vue JS v-html 指令呈现原始 html

javascript - Angular 故事书错误 : Cannot match any routes. URL 段: 'iframe.html'

angular - Angular 实际上是如何触发生命周期钩子(Hook)的?