2017-05-10 8 views
0

ngModuleを設定するために再利用可能なクラスを作成しようとしています。ngModuleメタデータを含むクラスを返す

クラスには、次のようになります。

export class IncludeServerApp { 
    constructor(AppComponent: any, AppModule: any) { 
    return @NgModule({ 
     bootstrap: [AppComponent], 
     providers: [ 
     { 
      provide: APP_BOOTSTRAP_LISTENER, 
      useFactory: onBootstrap, 
      multi: true, 
      deps: [ 
      ApplicationRef, 
      TransferState 
     } 
     ], 
     imports: [ 
     BrowserModule.withServerTransition({ 
      appId: 'my-app-id' 
     }), 
     ServerModule, 
     ServerTransferStateModule, 
     AppModule 
     ] 
    }) 
    class ServerAppModule { } 
    } 
    } 
} 

私はそのようにのようなクラスを使用します。

new IncludeServerApp(AppComponent, AppModule) 

しかし、私はこのエラーを取得しています:私は何から

Error: No NgModule metadata found for '[object Object]'. 
     at NgModuleResolver.resolve (/Users/michael/Code/ng-universal-demo/dist/server.js:73337:23) 
     at CompileMetadataResolver.getNgModuleMetadata (/Users/michael/Code/ng-universal-demo/dist/server.js:73921:60) 
     at JitCompiler._loadModules (/Users/michael/Code/ng-universal-demo/dist/server.js:85088:66) 
     at JitCompiler._compileModuleAndComponents (/Users/michael/Code/ng-universal-demo/dist/server.js:85047:52) 
     at JitCompiler.compileModuleAsync (/Users/michael/Code/ng-universal-demo/dist/server.js:85009:23) 
     at Promise (/Users/michael/Code/ng-universal-demo/dist/server.js:112849:22) 
     at new ZoneAwarePromise (/Users/michael/Code/ng-universal-demo/dist/server.js:151252:29) 
     at getFactory (/Users/michael/Code/ng-universal-demo/dist/server.js:112835:12) 
     at View.engine (/Users/michael/Code/ng-universal-demo/dist/server.js:112813:13) 
     at View.render (/Users/michael/Code/ng-universal-demo/dist/server.js:116553:8) 

をWebpackは何らかの理由でコンパイルした後に@ngModuleコードを削除しています。これは実際に可能ですか?返信しようとしているServerAppModuleクラスのメタデータを提供するために@ngModuleが使用されていることを理解しています。

私は@ngModule前にリターンを持っている場合は、エラーがある気づいた:

Error: No NgModule metadata found for '[object Object]' 

それはclass ServerAppModule {}前にある場合は、エラーがある:

Error: No NgModule metadata found for 'ServerAppModule'. 

答えて

2

私の知る限りではそれはうまくいくはずですが、あなたのアプリケーションに大きなブーストを与えるAOT機能を持たないことに注意してください。だから、このようなことをする本当に良い理由があるはずです。

とにかく、私の推測では、モジュールではなく、他の方法で回避

IncludeServerApp.createServerApp(AppComponent, AppModule) 

、あなたのクラスは、コンポーネントの最初の期待するので、あなたのパラメータを切り替え:)と静的メソッドを作成する必要があり、そしてまた、あなたのリターンを移動してください:

export class IncludeServerApp { 

    static createServerApp(appComponent, appModule) { 
    @NgModule({...}) 
    class ServerAppModule {} 

    return ServerAppModule ; 
    } 
} 
+0

AOTチップありがとうございます。申し訳ありませんが、paramsはtypoでした。私はコンストラクタでのリターンも見逃しました。 @ngModuleの前に返ってきたことが気になったのですが、エラーは '' 'Errorです:' ['Object ']'' 'の' '' '' ServerAppModule {} '' 'エラー: '' 'エラー: 'ServerAppModule'のNgModuleメタデータが見つかりません。' '' –

+0

はい、戻り値が間違っています。あなたは私が信じる下に置くべきです。私の答えを変えてください。そして、コンストラクタから別のものを返すことはできません。余分なメソッドを追加するか、そのエラーを修正した静的メソッド – PierreDuc

+0

を使用する必要がありますが、今度はAppModuleについて取得しています - '' 'Error:モジュール 'ServerAppModule'によってインポートされた予期しない値 'AppModule'。 @NgModuleアノテーションを追加してください.''' –

関連する問題