Служба маршрутизации Angular2 RC5 синглтон

Я недавно перешел на Angular 2 RC 5 и преобразовал подмодули в моем приложении в NgModule.

Принимая во внимание следующий элемент, предоставленный в документации по маршрутизации Angular2, как CrisisService в CrisisCenterModule может быть превращен в одноэлементный файл с состоянием, который совместно используется на маршрутах модуля кризисного центра.

В настоящее время создается новый CrisisService для каждого маршрута в модуле.

например, если вы добавляете простой конструктор в CrisisService, например, так:

constructor() {
  console.log("Hello from CrisisService");
}

Консоль браузера будет выходить из этой строки каждый раз, когда вы ссылаетесь на другой суб-маршрут, например, / кризис-центр или / кризис-центр /11

Я хотел бы иметь возможность обмениваться состоянием между компонентами в модуле через службу, которая очищается всякий раз, когда вы отправляетесь из этого модуля, без перемещения службы в глобальную общую модель.

Благодарю вас

2 ответа

Отредактированный ответ 2016 Dec 05 в 11:14:

Проблема была ошибкой и была исправлена ​​в https://github.com/angular/angular/issues/11125.

Таким образом, теперь вы можете загрузить сервис в любом модуле, а не только в приложении, и у вас будет одноэлементное приложение для его детей.

Старый ответ - 2016 авг 22 в 20:20:

Я нашел решение, предоставляющее услугу, в RootModule (AppModule), а не в Submodule (CrisisCenterModule).

Теперь я знаю, является ли это ошибкой или правильным поведением.

Если вы найдете какую-либо документацию по этому поводу, пожалуйста, дайте мне знать, или я открою проблему в репозитории Angular2 github.

Как говорит m32da1, служба используется только в CrisisCenterModule. Что я сделал, лениво загрузил свои маршруты:

export const routes: Routes = [ 
{ path: '', redirectTo: 'login', pathMatch: 'full' }, 
{ path: 'crisis', loadChildren: 'app/crisis-center/crisisCenter.module' } 
...

и добавьте CrisisServices в качестве поставщика в модуль кризисного центра

Если вы планируете использовать его и в других компонентах / маршрутах, вы можете сделать его одноразовым: https://angular.io/docs/ts/latest/guide/ngmodule.html

Добавить общий.module.ts

import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule }        from '@angular/common';
import { FormsModule } from '@angular/forms';
import { HeroesModule } from './heroes/heroes.module';
import { LoginComponent } from './login.component';
import { DialogService }  from './dialog.service';
import { CrisisService }  from './crisis-center/crisis.service';
@NgModule({
    imports: [CommonModule, FormsModule, RouterModule ],
    declarations: [],
    exports: [
        CommonModule, FormsModule, RouterModule]
})
export class SharedModule {

    static forRoot(): ModuleWithProviders {
        return {
            ngModule: SharedModule,
            providers: [DialogService, CrisisService],
        };
    }
}

И добавьте SharedModule.forRoot к импорту в app.module.ts:

import { NgModule }       from '@angular/core';
import { BrowserModule }  from '@angular/platform-browser';
import { FormsModule }    from '@angular/forms';

import { AppComponent }       from './app.component';
import { routing,
         appRoutingProviders } from './app.routing';

import { HeroesModule } from './heroes/heroes.module';

import { LoginComponent } from './login.component';

import { DialogService }  from './dialog.service';

@NgModule({
  imports: [
    BrowserModule,
    SharedModule.forRoot(),
    routing,
    HeroesModule
  ],
  declarations: [
    AppComponent,
    LoginComponent
  ],
  providers: [
    appRoutingProviders
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule {
}
Другие вопросы по тегам