- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我第一次更改应用程序的语言时,翻译服务会请求代表新语言的文件,我的“智能”组件字符串会正确反射(reflect)更新,但任何“纯/哑”组件都不会,它们会保留在以前的语言中。然而,一旦新的语言文件被加载到缓存中并且我继续更改语言,一切似乎都工作正常。
似乎任何纯组件都不会解析来自新语言文件的 ajax 响应的更新,它只会在文件已加载到缓存中时正确更改语言。同样,这仅适用于使用 ChangeDetectionStrategy.OnPush 的组件
我了解在dumb组件中使用输入和 Observable 的 changeDetection,但在这种情况下,我对管道不太熟悉。可能我遗漏了什么?
更新
我已经设法破解了一个修复程序,它不是很好,但它可以工作。这是我的服务中包装翻译服务的构造函数。
我检查是否已在缓存中为我将要选择的语言准备了语言 json 文件。如果我没有它,我会使用 ng2-translate 中的“reloadLang”方法去获取它。获得它后,我使用空超时,然后调用“translate.use”。某处存在时间问题,因为如果我取消超时,它就不起作用。如果我已经有了要切换到的翻译文件,我只需正常使用 translate.use 即可,一切正常。
constructor(private translate: TranslateService, public store: Store<any>) {
// this language will be used as a fallback when a translation isn't found in the current language
translate.setDefaultLang('en');
// subscribe to changes
store.select('i18n').subscribe((state: MultilingualStateI) => {
// update ng2-translate which will cause translations to occur wherever the TranslatePipe is used in the view
if (this.translate.getLangs() && (this.translate.getLangs().indexOf(state.lang) > -1)) {
this.translate.use(state.lang)
} else {
this.translate.reloadLang(state.lang).take(1).subscribe(() => {
setTimeout(() => this.translate.use(state.lang), 0);
});
}
});
我不完全确定这里发生了什么,但它似乎是使用 ChangeDetectionStrategy.OnPush 和请求翻译文件的新响应之间的混合。如果其他人看到此内容,请添加您的意见。
最佳答案
我被这个问题困住了。我有一些图表(我正在使用 ng2-charts
)并且当我更改语言时(例如,从 en
到 es
),所有除了与图表相关的标签外,标签已更新。为了用新语言更新图表,我不得不再次将语言更改为 es
(因此,第一次双击更改语言)。
在阅读了您的问题和解决方法后,我进行了检查,正如您所指出的,问题出在缓存上。第一次更改语言时,会加载 JSON,但由于它不在缓存中,因此并非所有组件都得到翻译(在我的例子中,图表未正确更新)。第二次更改为相同的语言时,标签已在缓存中,因此它可以正常工作。
我通过在初始化服务时加载所有可用语言来修复它:
constructor(private translate: TranslateService) {
var navigatorLanguage = (window.navigator.userLanguage || window.navigator.language).toLowerCase().split("-")[0];
// this language will be used as a fallback when a translation isn't found in the current language
translate.setDefaultLang(navigatorLanguage);
// the lang to use, if the lang isn't available, it will use the current loader to get them
translate.use(navigatorLanguage)
// Hack to load all languages
// If we don't do this, the first time we change language not all elements are properly translated
translate.reloadLang('en')
translate.reloadLang('es')
}
就我而言,我只有这两种语言。如果有更多,也许一些 for 循环将有助于重新加载每个 lang :)
关于angular - ng2-translate - 翻译字符串未在具有 OnPush 更改检测的组件中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38272388/
我有两个组件,都设置为 OnPush。调用 getAccount() 后,父组件将 accountLoading 设置为 true,然后在调用完成后将 accountLoading 设置为 false
我正在尝试衡量变化检测策略的性能差异。 我已经添加了 Angular 分析器,并使用 Default 检查,然后将 onPush 添加到我们的大多数组件,这些是结果:(开发模式) 默认:{ msPer
我不明白为什么子组件的更改检测会在这种情况下运行: import { Component, ChangeDetectionStrategy } from '@angular/core' @Compon
我不明白为什么子组件的更改检测会在这种情况下运行: import { Component, ChangeDetectionStrategy } from '@angular/core' @Compon
最好的使用方法是什么OnPush更改检测可以使更改灵活并且在测试中也非常简单?通过各种教程,我发现可以使用 OnPush : 首先是在 View 中直接使用服务中的可观察对象,我不确定该方法是否有效。
可能是我误解了 Angular changeDetection 策略。 这里是描述: 我有 2 个同级组件(S1 和 S2) 将这两个组件都视为显示一些图形数据的小部件 加载时,我想一开始就在两个
我正在编写一个 Angular 2 应用程序,出于性能原因,我尝试在所有地方使用 ChangeDetectionStrategy.OnPush。我有一个复杂的组件需要 OnPush 才能顺利工作,其中
我有一个看起来像这样的子组件: @Component({ selector: 'app-child', changeDetection: ChangeDetectionStrategy.OnP
我正在尝试熟悉 Angular 2 的 ChangeDetectionStrategy.OnPush 性能提升(如 here 所述)。但我这里有古玩盒。 我有父 AppComponent: @Comp
我正在构建一个包含许多组件的 Angular 4 应用程序,其中 ChangeDetectionStrategy 是 OnPush。同时the Angular Documentation on the
我是否应该始终在我的组件中使用 ChangeDetectionStrategy.OnPush? 我总是听说 OnPush 非常棒,它解决了很多问题,加快了 Angular 应用程序的速度,甚至摆脱了
我有一个数据表组件 ( angular2-data-table) 项目,我们将项目从 Angular 的传统变化检测更改为 OnPush 以优化渲染速度。 实现新的变更检测策略后,当数据对象发生突变(
我有一个使用服务提交一些数据的组件。 该组件使用 ChangeDetectionStrategy.OnPush ,但发生了一些奇怪的事情: 当请求 成功 : next回调被调用,formStatus更
正如标题所说:我正在处理一个非常大的项目,而且我使用过的组件很少 ChangeDetectionStrategy.OnPush以免表现不佳。我想知道,将策略的每个组件都放入“好”,以防万一,使用 Ch
我在理解 Angular OnPush 检测策略时遇到问题。当我执行一些异步操作时(例如从 TS 打开覆盖,这样就不会导致使用 OnPush 策略检测组件上的更改),然后我单击任意位置,或调用其他检测
我想在使用 OnPush 变化检测策略上传之前预览多张图片。 我试试这个 https://stackblitz.com/edit/angular-mnltiv 当我添加 OnPush 时它停止工作,我
我有一个使用 ngFor 显示子组件列表的父组件。我注意到随着 child 数量的增加,性能变得非常糟糕,所以我将两者都更改为 OnPush 更改检测策略。 这很有帮助,但仍然有一些情况会变慢,我可以
https://stackblitz.com/edit/angular-xpamld 问题:有人能帮我理解为什么我的原型(prototype)的 changeDetection: ChangeDete
当我们使用默认策略时,这些家伙可以触发变更检测(当然除了输入参数): 用户事件 计时器 ajax 响应 但是。当您切换到 OnPush 策略 时,它仅由事件 触发并且不适用于计时器和 http。 所以
@Component({ selector: "parent", template: ``, changeDetection: ChangeDetectionStrategy.
我是一名优秀的程序员,十分优秀!