【发布时间】:2018-10-16 00:13:09
【问题描述】:
在我的项目(Angular 5 + Firebase)中,用户需要在登录页面选择语言。为此,我添加了选择选项并将选择的值作为参数传递给第一页,如下所示:
form_login(f:NgForm){
if (!f.valid)
return;
this.afAuth.auth.signInWithEmailAndPassword(f.controls.email.value, f.controls.password.value)
.then(ok => {
this.router.navigate(["/perfil", f.controls.lang.value]); //>> here
});
}
在 url 中有这个参数,我检索这个值并使用 ngx-translate 来翻译整个页面,如下所示:
perfil.component.ts
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
constructor(private translate: TranslateService,
private route: ActivatedRoute,
private router: Router) {
...
translate.setDefaultLang('en');
let lang = this.route.snapshot.paramMap.get('lang');
this.translate.use(lang);
console.log(lang);
}
perfil.component.html
<h5 translate>Companyprofile</h5>
完美运行。除了因为还有一个导航栏,而且这个组件根本没有获取语言值。虽然翻译了链接标签,但每个routerLink的值并没有捕捉到参数的值,而是将每个链接设置为undefined,其中应该是语言的值。
navbar.component.ts
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
constructor(private translate: TranslateService,
private route: ActivatedRoute,
private router: Router) {
...
translate.setDefaultLang('en');
let lang = this.route.snapshot.paramMap.get('lang');
this.translate.use(lang);
console.log(lang); // >> in this case, the console displays `null`
}
尝试在 navbar.component.ts 上获取此值,我在控制台上出现此错误:
navbar.component.ts:36 null
zone.js:2935 GET http://localhost:4200/assets/i18n/null.json 404 (Not Found)
core.js:1440 ERROR HttpErrorResponse {headers: HttpHeaders, status: 404, statusText: "Not Found", url: "http://localhost:4200/assets/i18n/null.json", ok: false, …}
navbar.component.html
<header id="topnav">
<ul class="navbar-nav" *ngFor="let p of perfil | async">
<li class="nav-item">
<a [routerLink]="['/agenda/', lang]" class="nav-link" translate>Agenda</a>
</li>
<li class="nav-item">
<a [routerLink]="['/admin/', lang]" class="nav-link" translate>Admin</a>
</li>
...
</ul>
</header>
<router-outlet></router-outlet> <!-- here I call other components, e.g perfil.component.html
例如,lang 参数应带值 'en'。但是,相反,它是undefined。
编辑:我所有的组件都是NavbarComponent 的子组件。 NavbarComponent 没有path,所以不能像我在其他路径中那样设置参数。
app.routing.module.ts
const AppRoutes: Routes = [
{path: '', component: AppComponent, children: [
{ path: '', redirectTo: '/login', pathMatch: 'full' },
{path: '', component: NavbarComponent, children: [
{path: 'agenda/:lang', component: AgendaComponent},
{path: 'perfil/:lang', component: PerfilComponent},
{path: 'servicos/:lang', component: CadastroServicoComponent},
{path: 'profissionais/:lang', component: ProfissionaisComponent},
{path: 'admin/:lang', component: AdminComponent},
{path: 'dashboard/:lang', component: DashboardComponent},
{path: 'signup/:lang', component: SignUpFormComponent}
]}
]}
]
@NgModule({
imports: [RouterModule.forRoot(AppRoutes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
代码有什么问题?
【问题讨论】:
-
如果我没看错的话,您正在使用
lang变量在navbar.component.html内创建routerLink。您是否在navbar.component.ts文件中的某处设置了此变量?因为在您的代码中,我只能在perfil.component.ts文件中找到lang变量。 -
是的,我也在
navbar.component.ts内部使用。在这种情况下,我已经编辑了我的问题并添加了关于console.log的评论。谢谢!
标签: javascript angular routes ngx-translate routerlink