Angular 使用ngxs操作触发ngx转换

Angular 使用ngxs操作触发ngx转换,angular,internationalization,translation,ngrx,ngxs,Angular,Internationalization,Translation,Ngrx,Ngxs,我试图通过使用ngxs操作来更改应用程序的语言。Actions使用TranslationService调用如下内容。translate.use(action.lang) 它在appinit上工作没有任何问题。意味着我使用APP_初始值设定项触发一个动作,从cookie值设置语言。很好 相同的动作由按钮触发。但是你必须在语言之间切换两次才能看到效果 意思是:从“en”改为“de”,什么都不会发生 从“de”更改为“en”nothing 从“en”改为“de”你现在看到新语言了吗 但所有行动都能正常

我试图通过使用ngxs操作来更改应用程序的语言。Actions使用TranslationService调用如下内容。translate.use(action.lang)

它在appinit上工作没有任何问题。意味着我使用APP_初始值设定项触发一个动作,从cookie值设置语言。很好

相同的动作由按钮触发。但是你必须在语言之间切换两次才能看到效果

意思是:从“en”改为“de”,什么都不会发生 从“de”更改为“en”nothing 从“en”改为“de”你现在看到新语言了吗

但所有行动都能正常运作。您可以直接输出值,一切正常

有什么建议我可以研究一下。据人们所知,ngx翻译非常复杂。我只是不能创建一个简单的抽象来显示一些代码

正如我提到的,第一次发送一个动作效果很好。您还可以在存储的变量中看到正确的值。只有更改不会触发转换。请正确使用(lang)

我也试着打了两次电话。我在点击按钮时发出了两次动作。我还试着打了两次电话给translate.use(lang)。我还尝试将其包装到setTimeout中,以检查是否存在与异步调用相关的问题

从'@angular/core'导入{NgModule};
从“@angular/common”导入{CommonModule};
从'@ngx translate/core'导入{TranslateLoader,TranslateModule,TranslateService};
从'@ngx translate/http loader'导入{TranslateHttpLoader};
从'@angular/common/http'导入{HttpClient};
导出函数HttpLoaderFactory(http:HttpClient){
返回新的TranslateHttpLoader(http);
}
@NGD模块({
声明:[],
进口:[
公共模块,
TranslateModule.forRoot({
加载器:{
提供:TranslateLoader,
使用工厂:HttpLoaderFactory,
deps:[HttpClient]
}
}),
],
出口:[
翻译模块
],
提供者:[翻译服务],
})
导出类LanguageModule{}
我的行动是这样的:

@Action(SetLanguageAction)
设置语言(
ctx:StateContext,
操作:SetLanguageAction
) {
//这会改变你的状态
ctx.patchState({
活动:action.lang
});
this.translate.use(action.lang);
}

我希望在单击按钮时更改语言,使其与不使用操作时的语言相同。

由于我的评论对您有所帮助,我将把它作为一个答案。对于在角度区域之外调用动作处理程序的其他人来说,这可能很有用。包装
translate.use
调用
this.ngZone.run(()=>this.translate.use(action.lang))
。别忘了将facade类注入您的state
构造函数(私有ngZone:ngZone){}
谢谢您完全解决了我的问题!