Angular 7/Electron:路由在 BrowserWindow.hide 后跟 BrowserWindow.show 后未完成
Angular 7/Electron: Routing does not complete after BrowserWindow.hide followed by BrowserWindow.show
我有一个在 Electron window 中运行的 Angular 7 应用程序。 main.ts
中的 Electron 进程必须执行以下操作:
main.ts
:显示window + 将url加载到Angular app
- Angular:做它的事
- Angular: 使用 ipcRenderer 告诉主进程它暂时完成了
main.ts
: BrowserWindow.hide()
main.ts
: 其他
main.ts
: BrowserWindow.show()
main.ts
: mainWindow.webContents.send('route', '/myroute');
- Angular:
this.ipcRenderer.on('route', (event: any, route: string) => { this.router.navigateByUrl(route); });
预期行为:window 隐藏,然后显示并显示新组件。
实际行为:window 隐藏,然后显示并显示一个部分加载的组件,然后是前一个路由的(例如入口点)组件。
app-routing.module.ts
import { NgModule } from '@angular/core';
import { Router, RouterModule, Routes } from '@angular/router';
<route component imports>
const routes: Routes = [
{ path: '', redirectTo: '/entrypoint', pathMatch: 'full' },
{ path: 'entrypoint', component: EntryPointPageComponent },
{ path: 'myroute', component: MyRouteComponent },
{ path: '**', redirectTo: '/entrypoint' }
];
@NgModule({
exports: [ RouterModule ],
imports: [ RouterModule.forRoot(routes, { useHash: true }) ]
})
export class AppRoutingModule {
constructor(private router: Router) {
this.router.events.subscribe((value) => {
console.log(`Router event! ${ typeof value}: ${ value }`);
}, (err) => {
console.log(`Router failure! ${ err }`);
});
}
}
当到达 /myroute
的路线时,我看到以下事件按此顺序进行:NavigationStart
、RoutesRecognized
、GuardsCheckStart
、ChildActivationStart
, ActivationStart
, GuardsCheckEnd
, ResolveStart
, ResolveEnd
, ActivationEnd
, ChildActivationEnd
, NavigationEnd
, Scroll
.
最后,我使用控制台日志语句在 MyRouteComponent
中实现了所有事件生命周期,但是其中 none 被执行了。
知道阻止路由成功工作的问题是什么吗?
我们能够在内部解决这个问题,现在我觉得自己很蠢。
诀窍是将路由请求包装在 ngZone.run()
内。
我有一个在 Electron window 中运行的 Angular 7 应用程序。 main.ts
中的 Electron 进程必须执行以下操作:
main.ts
:显示window + 将url加载到Angular app- Angular:做它的事
- Angular: 使用 ipcRenderer 告诉主进程它暂时完成了
main.ts
: BrowserWindow.hide()main.ts
: 其他main.ts
: BrowserWindow.show()main.ts
:mainWindow.webContents.send('route', '/myroute');
- Angular:
this.ipcRenderer.on('route', (event: any, route: string) => { this.router.navigateByUrl(route); });
预期行为:window 隐藏,然后显示并显示新组件。
实际行为:window 隐藏,然后显示并显示一个部分加载的组件,然后是前一个路由的(例如入口点)组件。
app-routing.module.ts
import { NgModule } from '@angular/core';
import { Router, RouterModule, Routes } from '@angular/router';
<route component imports>
const routes: Routes = [
{ path: '', redirectTo: '/entrypoint', pathMatch: 'full' },
{ path: 'entrypoint', component: EntryPointPageComponent },
{ path: 'myroute', component: MyRouteComponent },
{ path: '**', redirectTo: '/entrypoint' }
];
@NgModule({
exports: [ RouterModule ],
imports: [ RouterModule.forRoot(routes, { useHash: true }) ]
})
export class AppRoutingModule {
constructor(private router: Router) {
this.router.events.subscribe((value) => {
console.log(`Router event! ${ typeof value}: ${ value }`);
}, (err) => {
console.log(`Router failure! ${ err }`);
});
}
}
当到达 /myroute
的路线时,我看到以下事件按此顺序进行:NavigationStart
、RoutesRecognized
、GuardsCheckStart
、ChildActivationStart
, ActivationStart
, GuardsCheckEnd
, ResolveStart
, ResolveEnd
, ActivationEnd
, ChildActivationEnd
, NavigationEnd
, Scroll
.
最后,我使用控制台日志语句在 MyRouteComponent
中实现了所有事件生命周期,但是其中 none 被执行了。
知道阻止路由成功工作的问题是什么吗?
我们能够在内部解决这个问题,现在我觉得自己很蠢。
诀窍是将路由请求包装在 ngZone.run()
内。