角度模块 - 静态解析符号值时出错

时间:2017-07-12 12:39:24

标签: javascript angular angular-module

我已按照此guide

创建了以下模块
@NgModule({
    // ...
})
export class MatchMediaModule {

    private static forRootHasAlreadyBeenCalled: boolean = false;

    // The method is used for providing the 
    // feature module's providers only ONCE 
    static forRoot(): ModuleWithProviders {
        if (this.forRootHasAlreadyBeenCalled) {
            throw new Error('ModuleWithProviders - forRoot() should only be called once in the root module!');
        }

        this.forRootHasAlreadyBeenCalled = true;

        return {
            ngModule: MatchMediaModule,
            providers: [MatchMediaService],
        };
    }

}

MatchMediaModule模块导入CoreModule

@NgModule({
    imports: [
        CommonModule,
        MatchMediaModule.forRoot() // <--
    ],
})
export class CoreModule { }

并运行ng serve,抛出以下错误:

  

ERROR in Error遇到静态解析符号值。调用   function&#39; MatchMediaModule&#39;,不支持函数调用。   考虑使用对a的引用替换函数或lambda   导出函数,解析符号CoreModule   /Users/alex/www/mdello-port/src/app/core/core.module.ts,解决   符号CoreModule in   /Users/alex/www/mdello-port/src/app/core/core.module.ts

然而,在做了一些小改动后,导致cli重新编译应用程序,一切都运行没有问题。

删除forRoot()方法并直接提供服务似乎也有效。尽管如此,我仍然希望保留在上述模块的延迟加载期间防止多个单例实例创建的好处。

有没有办法在不影响上述好处的情况下修复此错误?

1 个答案:

答案 0 :(得分:1)

以下列方式重写forRoot()已解决问题:

@NgModule({
    // ...
})
export class MatchMediaModule {

    // ** REMOVED **

    // The method is used for providing the 
    // feature module's providers only ONCE 
    static forRoot(): ModuleWithProviders {

        // ** REMOVED **

        return {
            ngModule: MatchMediaModule,
            providers: [MatchMediaService],
        };
    }

}

似乎问题是由forRoot()方法的副作用引起的。