2016-12-28 3 views
0

Есть ли способ предоставления @Injectable s в качестве компонентов для загрузки одиночных пакетов с использованием loadChildren (ленивые компоненты загрузки)?Angular2: ленивые загрузочные компоненты и инъецируемые материалы как одиночные литеры

Если нет, есть ли способ получить его?

Я прошу об этом this post. В соответствии с этим невозможно ввести @Injectable в виде синглетонов на подмодулях.

Я пытаюсь привнести в @Injectable AppState как одноточечный:

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

    constructor() { 

    } 
... 

Я поставил его на AppModule как provider:

// 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 является undifined если I'set его раньше в другом компоненте?

+0

Не предоставляйте его на уровне вашей ленивой загрузки _modules_. Вы должны будете предоставить его на уровне 'app.module' (или если вы используете его в своем« core.module »). –

+0

Что относительно [этого сообщения] (http://stackoverflow.com/a/40981772/217408)? – Jordi

ответ

2

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

+0

Я отредактировал сообщение. В соответствии с этим. Если я добавляю 'AppState' в' AppModule (constructor (private appState: AppState)), он должен быть одним и тем же объектом (singleton) на 'LoginComponent' и' ProfileComponent', не так ли? Тем не менее, 'this.appState.user' всегда' undefined', независимо от того, назначил ли он 'LoginComponent' ... – Jordi

+0

@Jordi Почему вы объявляете' AppState' в массиве поставщиков 'ProfileModule' и' LoginModule'? Вы пытались объявить его только в «AppModule»? – yurzui

+0

Я думал, что он должен быть объявлен поставщиком в каждом запрошенном модуле ... – Jordi

1

Все @Injectable() услуги являются одиночными. Загрузка компонентов - это работа маршрутизатора, а не сервиса.

+0

Что относительно [этого сообщения] (http://stackoverflow.com/a/40981772/217408)? – Jordi

Смежные вопросы