我正在使用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.
DigFinder组件绝对仅在其模块中声明:
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 { }
单元测试都通过了,但是当故事书渲染该错误时就会出现:
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', () => ({
component: DigFinderComponent,
props: {
data: testData,
select: action('Selected: ')
}
}));
答案 0 :(得分:3)
之所以发生这种情况,是因为您在Storybook component
方法中使用了add
道具。我相信这就是在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,
}
}));
请注意,您仍然需要props
。
答案 1 :(得分:2)
我能够通过显式导入所有需求而不是导入模块来解决此问题:
storiesOf('DigFinder', module)
.addDecorator(
moduleMetadata({
declarations: [DigFinderComponent, DigFinderPanelComponent, DigFinderNodeComponent],
imports: [
CommonModule,
DigBreadcrumbsModule,
DigCardModule,
DigContainerModule,
DigUiModule,
RouterModule
],
})
)
.add('Default', () => ({
component: DigFinderComponent,
props: {
data: testData,
select: action('Selected: ')
}
}));
但是仍然想弄清楚为什么模块导入不起作用(它在其他几个示例中起作用)。
答案 2 :(得分:0)
是否应该导入:
import {DigFinderComponent} from '../../../src/modules/dig/dig-finder/components/dig-finder/dig-finder.component';
要从模块导入吗?
import {DigFinderComponent} from '../../../src/modules/dig/dig-finder/dig-finder.module';