2016-12-28 6 views
0

loadChildren(遅延ロードコンポーネント)を使用して、シングルトンローディングコンポーネントとして@Injectableを提供することはありますか?Angular2:レイジーローディングコンポーネントと注射器をシングルトンとして

もしそうでない場合は、入手する方法はありますか?

私はthis postを求めています。それによれば、サブモジュールとしてシングルトンとして@Injectableを注入することはできません。

私はシングルトンとして@Injectable AppStateを注入しようとしている:私はproviderとしてAppModuleの上に設定した

@Injectable() 
export class AppState { 
    public user: string; 

    constructor() { 

    } 
... 

// Application wide providers 
const APP_PROVIDERS = [ 
    AppState 
]; 

@NgModule({ 
    bootstrap: [ App ], 
    declarations: [ 
    App, 
    ErrorComponent 
    ], 
    imports: [ // import Angular's modules 
    BrowserModule, 
    FormsModule, 
    HttpModule, 
    RouterModule.forRoot(ROUTES, { useHash: true }) 
    ], 
    providers: [ 
    APP_PROVIDERS 
    ] 
}) 
export class AppModule { 
    constructor(public appRef: ApplicationRef, public appState: AppState) {} 
} 

だから、私はまた"submodule"を作成しました:

@NgModule({ 
    //... 
    providers: [ AppState ] 
}) 
export default class LoginModule { 

オンLoginComponent私は:

それでも
export class Login implements OnInit { 

    constructor(private appState: AppState) {} 

    public doLogin():void { 
     this.appState.user = this.form.value.mail; 
    } 
} 

Profileという名前の別のコンポーネントに、this.appState.userが定義されていないようです。

@NgModule({ 
    //... 
    providers: [ AppState ] 
}) 
export default class ProfileModule { /... } 

@Component({ 
    //... 
}) 
export class Profile implements OnInit { 

    constructor(private appState: AppState) { 

    } 

    ngOnInit():void { 
    this.user = this.appState.user; <<<<<<<<<<<<< it's undefined 
    } 
} 

なぜthis.appState.userが別のコンポーネントで前もって設定されているのですか?

+0

遅延ロード_modules_のレベルでは提供しないでください。あなたは 'app.module'レベルでそれを提供しなければなりません(またはあなたの' core.module'でそれを使用する場合)。 –

+0

[この記事について](http://stackoverflow.com/a/40981772/217408)? – Jordi

答えて

2

この投稿はあなたが知る必要があるすべてを説明しています。遅延読み込みモジュールで宣言されたサービスは、そのモジュールのシングルトンのみになります。ルートモジュールにロードされたサービスは、遅延ロードされたモジュールを含めて、アプリケーション全体でシングルトンになります。

+0

投稿を編集しました。それによると。 'AppStore'を' AppModule(コンストラクタ(private appState:AppState)) 'に挿入すると、' LoginComponent'と 'ProfileComponent'と同じオブジェクト(シングルトン)でなければなりません。それにもかかわらず、 'this.appState.user'は、' LoginComponent'がそれを割り当てているかどうかにかかわらず、常に 'undefined'です... – Jordi

+0

@Jordiなぜ' ProfileModule'と 'LoginModule'のプロバイダ配列で' AppState'を宣言していますか?あなたは 'AppModule'で宣言しようとしましたか? – yurzui

+0

私はそれが要求されたすべてのモジュールでプロバイダとして宣言されなければならないと考えました... – Jordi

1

すべて@Injectable()サービスはシングルトンです。コンポーネントの読み込みは、サービスではなくルータの仕事です。

+0

[この記事について](http://stackoverflow.com/a/40981772/217408)? – Jordi

関連する問題