我正在使用 jest 在 lib 上运行一些测试,在升级现在导出到 es6 的 lib 后,我收到错误“无法在模块外使用 import 语句”,在升级之前测试工作得很好。
我正在使用的 jest.config.js 文件:
module.exports = {
roots: ['<rootDir>/src/'],
transform: {
'^.+\\.tsx?$': 'ts-jest',
},
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.ts?$',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
};
Run Code Online (Sandbox Code Playgroud)
tsconfig.json 文件:
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"lib": ["es6", "dom"],
"types": ["jest"],
"sourceMap": true,
"jsx": "react",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"moduleResolution": "node",
"forceConsistentCasingInFileNames": true,
"strict": true,
"emitDecoratorMetadata": true,
"importHelpers": true,
"noEmitHelpers": true,
"noFallthroughCasesInSwitch": true,
"strictFunctionTypes": false,
"pretty": true,
"removeComments": false,
"noImplicitReturns": true,
"noImplicitThis": …Run Code Online (Sandbox Code Playgroud) 我在一个项目中使用 Angular 8,并且在启动动态组件时遇到问题,因为 ngOnInit 没有被调用。我构建了一个名为 PlaceholderDirective 的指令,如下所示:
@Directive({
selector: '[appPlaceholder]'
})
export class PlaceholderDirective {
constructor(public viewContainerRef: ViewContainerRef) {}
}
Run Code Online (Sandbox Code Playgroud)
并在 ng-template 上使用该指令:
<ng-template appPlaceholder></ng-template>
Run Code Online (Sandbox Code Playgroud)
保存 ng-template 所在 HTML 的组件启动动态组件,如下所示:
@ViewChild(PlaceholderDirective, {static: false}) private placeholder: PlaceholderDirective;
...
constructor(private componentResolver: ComponentFactoryResolver) {}
...
public launchSensorEditComponent(id: number) {
const componentFactory = this.componentResolver.resolveComponentFactory(SensorEditComponent);
const hostViewContainerRef = this.placeholder.viewContainerRef;
hostViewContainerRef.clear();
const sensorEditComponentRef = hostViewContainerRef.createComponent(componentFactory);
sensorEditComponentRef.instance.sensorId = id;
}
Run Code Online (Sandbox Code Playgroud)
实际的动态组件非常简单,它注册在AppModule的entryComponents部分中。我已将其范围缩小到最低限度,以便了解问题所在:
@Component({
selector: 'app-sensor-edit',
templateUrl: './sensor-edit.component.html',
styleUrls: ['./sensor-edit.component.css']
})
export class SensorEditComponent implements OnInit {
@Input() sensorId: …Run Code Online (Sandbox Code Playgroud) angular-components angular angular-dynamic-components angular-lifecycle-hooks