module - 两个页面的 ionic 4 translateModule 将导致 ERROR RangeError: Maximum call stack size exceeded
问题描述
我正在使用 ionic 4 创建我的应用程序项目。在过去,即 ionic 3,我可以为每个页面 module.ts 导入 TranslateModule.forChild()。但是对于 ionic 4,如果两个页面加载 TranslateModule.forChild(),则会导致超出最大调用堆栈大小。如果我删除其中一个,它会在没有堆栈大小的情况下正常工作,但只是该页面无法再翻译。
实际上,我的离子版本是 5.4.6。
这是我的代码:app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { HttpClientModule, HttpClient } from '@angular/common/http';
export function createTranslateLoader(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
@NgModule({
declarations: [AppComponent],
entryComponents: [],
imports: [
BrowserModule,
IonicModule.forRoot(),
AppRoutingModule,
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient]
}
}),
],
providers: [
StatusBar,
SplashScreen,
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
],
bootstrap: [AppComponent],
exports: [ TranslateModule ]
})
export class AppModule {}
**home.module.ts**
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IonicModule } from '@ionic/angular';
import { FormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';
import { HomePage } from './home.page';
import { TranslateModule } from '@ngx-translate/core';
@NgModule({
imports: [
CommonModule,
FormsModule,
IonicModule,
RouterModule.forChild([
{
path: '',
component: HomePage
}
]),
TranslateModule.forChild()
],
declarations: [HomePage]
})
export class HomePageModule {}
**auth.module.ts**
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { IonicModule } from '@ionic/angular';
import { AuthPage } from './auth.page';
import {TranslateModule} from '@ngx-translate/core';
@NgModule({
imports: [
CommonModule,
FormsModule,
IonicModule,
TranslateModule.forChild()
],
declarations: [AuthPage]
})
export class AuthPageModule {}
解决方案
我只是通过了相同的问题并解决了它,您应该将所有页面视为 LazyLoad,就像您在 home.module 中实际执行的操作一样:
RouterModule.forChild([
{
path: '',
component: HomePage
}
]),
因此,在您的 auth.module 中,导入声明也必须包含 RouterModule:
RouterModule.forChild([
{
path: '',
component: AuthPage
}
])
...
这应该可以解决问题并避免超出堆栈大小。如果您将某些东西用作 SharedModule,我建议您在其中添加 TranslateModule 以使其在您的应用程序结构中更容易:
import { TranslateModule } from '@ngx-translate/core';
@NgModule({
declarations: [],
imports: [
...
TranslateModule,
],
exports: [
...
TranslateModule,
]
})
export class SharedModule { }
然后在您的任何下一页模块中,只需导入 SharedModule 即可完成:
imports: [
...
SharedModule,
]
希望能帮助到你!
推荐阅读
- angular - 仅在使用 [routerLink] 时,从导航组件中的链接路由到命名出口失败
- windows - 如何在 Windows 主机上使用 Cygwin 配置 Ansible
- junit - 使用 Appium (java) + Cucumber + jUnit 在 Browserstack 上运行并行测试
- swift - 保存数据数组会导致快速崩溃
- dataframe - 填补缺失的数据
- javascript - 六边形包装算法
- python - 在 Python 中离散化连续函数的有效方法
- c# - 在不阻塞 UI 的情况下实现 UDP 通信
- javascript - window.URLSearchParams 在 Edge 上损坏
- ios - Xcode Simulator 使用缓存文件