Свойство Angular Service не обновляется в ленивых загрузочных модулях. - PullRequest
0 голосов
/ 07 мая 2019

У меня есть приложение с лениво загруженными модулями.У меня также есть общий модуль с именем MainModule.Вот мой очень простой сервис под названием LangService:

@Injectable({
    providedIn: 'root'
}) 

export class LangService {

    lang:string = "en";

    constructor(public translate: TranslateService) {
        this.translate.setDefaultLang( this.lang );
        this.translate.use( this.lang );
    }

    setLang( lang ) {
        this.translate.setDefaultLang( this.lang );
        this.translate.use( this.lang );
        this.lang = lang;
    }
}

В маршрутизации моих вкладок у меня есть следующее:

changeLang(lang) {
    // lang is for example "fr"
    this.langService.setLang(lang);
}

И мои вкладки html:

<Label [text]="'HOME.Title' | translate"></Label>

Теперь, когда я иду по другому маршруту, в его компоненте я получаю значение по умолчанию (а не измененное значение):

constructor(public langService:LangService) {
    // prints "en" !!!
    console.log(this.langService.lang);
};

Я предоставил сервис в своем общем модуле и импортирую свой общий модуль везде:

providers: [
    LangService
],

Я использую Angular 7 с nativescript.

1 Ответ

1 голос
/ 07 мая 2019

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

Пример:

@Injectable({
    providedIn: 'root'
})
export class LangService {
}

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

Любые инъекции службы в эту услугу также должны вводиться в root и не быть частью поставщиков MainModule.

Проверьте этот пример, что i создан здесь : Язык, установленный в app.component, будет отображаться на экране сведений о клиенте, который загружен с отложенной загрузкой

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

...