For*_*man 6 typescript angular storybook
我正在使用 Storybook 测试一些共享组件上的 UI,并遇到一个错误,似乎 Storybook 正在将组件加载到 DynamicModule 中,导致以下错误:
Type DigFinderComponent is part of the declarations of 2 modules: DigFinderModule and DynamicModule! Please consider moving DigFinderComponent to a higher module that imports DigFinderModule and DynamicModule. You can also create a new NgModule that exports and includes DigFinderComponent then import that NgModule in DigFinderModule and DynamicModule.
Run Code Online (Sandbox Code Playgroud)
DigFinder 组件绝对只在其模块中声明:
Type DigFinderComponent is part of the declarations of 2 modules: DigFinderModule and DynamicModule! Please consider moving DigFinderComponent to a higher module that imports DigFinderModule and DynamicModule. You can also create a new NgModule that exports and includes DigFinderComponent then import that NgModule in DigFinderModule and DynamicModule.
Run Code Online (Sandbox Code Playgroud)
单元测试都通过了,但是当它被故事书渲染时出现这个错误:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DigFinderComponent } from './components/dig-finder/dig-finder.component';
import { DigFinderPanelComponent } from './components/dig-finder-panel/dig-finder-panel.component';
import { DigFinderNodeComponent } from './components/dig-finder-node/dig-finder-node.component';
import {DigUiModule} from '../dig-ui/dig-ui.module';
import {DigCardModule} from '../dig-card/dig-card.module';
import {DigContainerModule} from '../dig-container/dig-container.module';
import {DigBreadcrumbsModule} from '../dig-breadcrumbs/dig-breadcrumbs.module';
import {RouterModule} from '@angular/router';
@NgModule({
declarations: [DigFinderComponent, DigFinderPanelComponent, DigFinderNodeComponent],
imports: [
CommonModule,
DigBreadcrumbsModule,
DigCardModule,
DigContainerModule,
DigUiModule,
RouterModule
],
exports: [
DigFinderComponent
]
})
export class DigFinderModule { }
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为您在componentStorybookadd方法中使用了prop 。我相信这就是它在 DynamicModule 中的结果,然后 moduleMetadata 的导入是第二种方式。
一种解决方案是按照您的回答进行操作:跳过导入模块并声明/导入您需要的模块位。另一种方法是使用template道具而不是component道具:
import {moduleMetadata, storiesOf} from '@storybook/angular';
import {withNotes} from '@storybook/addon-notes';
import {action} from '@storybook/addon-actions';
import {DigFinderModule} from '../../../src/modules/dig/dig-finder/dig-finder.module';
import {DigFinderComponent} from '../../../src/modules/dig/dig-finder/components/dig-finder/dig-finder.component';
const testData = [
'/about',
'/about/team',
'/about/services',
]
storiesOf('DigFinder', module)
.addDecorator(
moduleMetadata({
imports: [
DigFinderModule,
]
})
)
.add('Default', () => ({
template: `
<app-dig-finder
[data]="data"
></app-dig-finder>
`,
props: {
data: testData,
}
}));
Run Code Online (Sandbox Code Playgroud)
注意props这里还是需要的。
如果导入:
import {DigFinderComponent} from '../../../src/modules/dig/dig-finder/components/dig-finder/dig-finder.component';
Run Code Online (Sandbox Code Playgroud)
而是从模块导入?
import {DigFinderComponent} from '../../../src/modules/dig/dig-finder/dig-finder.module';
Run Code Online (Sandbox Code Playgroud)