【问题标题】:Angular service property doesn't get updated in lazy loading modulesAngular 服务属性不会在延迟加载模块中更新
【发布时间】:2019-05-07 16:54:21
【问题描述】:

我有一个带有延迟加载模块的应用程序。我还有一个名为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
],

我正在使用带有 nativescript 的 Angular 7。

【问题讨论】:

  • 您应该在 root @Injectable({ providedIn: 'root' }) 上提供服务,而不是作为 SharedModule 的提供者。这将允许您仅拥有它的实例,并且可以在整个应用程序中使用,
  • @nircraft 我有它在我的服务。已更新。
  • 还要确保将其从任何其他模块的providers 列表或MainModule 列表中删除
  • @nircraft 这是不可能的。因为我在自己的服务中使用了翻译服务。当我删除 providers 它不起作用。请查看更新。
  • 您可以让 LangService 和 Translate 服务都在根目录下注入,而不是在共享模块中定义。在其他路线位置使用时可以正常工作。如果你能分享minimal reproducible example,那就太好了

标签: angular nativescript angular-services angular2-nativescript


【解决方案1】:

而不是在MainModule 中提供模块,这似乎在每次加载新模块时都会创建另一个实例。您应该在根目录下提供Injectable 服务。

例如:

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

该服务现在将只有一个实例,并且可以跨平台使用,并且所有模块都可以看到任何更新。还要确保将其从任何其他模块的providers 列表中删除。

对该服务的任何服务注入,也应注入root,而不是MainModule 的提供者的一部分。

检查这个例子,我created here:app.component 中设置的语言将显示在延迟加载的客户详细信息屏幕中

除非您在其他任何地方重置语言,否则它将按原样显示。

【讨论】:

  • 非常感谢您的关注。让我对此进行更多描述。 LangService 是我自己的服务,只是为了保存用户选择的语言。但是 TranslateService 是图书馆的服务(ngx-translate)。如果我像您提到的那样将 LangService 添加到 providers ,它会给我一个不同的 lang 属性实例化。但是如何从 SharedModule 中的providers 中删除它。首先,让我告诉我注入 TranslateService 来处理翻译。我这样做是因为我不想重复每个组件中的逻辑,而是根据用户选择在LangService中使用它。
  • 但是当我从 providers 中删除 LangService 时,TranslateService 不起作用。
  • @VahidNajafi,看看这是否对你有帮助:stackoverflow.com/a/50243449/9386929
  • 谢谢。我应该在哪里使用super()
  • 我在这里以更恰当的方式提出了我的问题:stackoverflow.com/questions/56030377/…
猜你喜欢
  • 2018-06-19
  • 1970-01-01
  • 2021-07-13
  • 2017-06-21
  • 2021-11-29
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多