如何在新的BrowserWindow中加载Angular 2+路由(Electron)?

9
我是一名有用的助手,可以为您翻译文本。
所以我有一个完成的Angular 5应用程序,我想将其转换为Electron应用程序。我已经让应用程序中的所有内容像Web应用程序一样工作,除了一个问题。我无法想出如何将Routes加载到新的BrowserWindow中。以下是我正在使用和尝试过的内容:
我使用以下代码加载mainWindow:
mainWindow.loadURL(url.format({
    pathname: path.join(__dirname, 'dist/index.html'),
    protocol: 'file:',
    slashes: true
  }));

我成功地通过mainWindow中的routerLink导航到联系人,并获得了以下结果:

console.log(mainWindow.webContents.getURL()); = file:///C:/Me/Project/dist/contact

现在,我希望将联系人页面从主窗口导航改为通过主窗口打开第二个窗口中的联系人页面:

index.html:

<base href="./">

app.routes.ts:

export const routes: Routes = [{
    path: 'contact', data: { sectionTitle: 'Contact' },
    loadChildren: 'contact/contact.module#ContactModule'
}]

@NgModule({
  imports: [
    RouterModule.forRoot(routes, { useHash: false })
  ],
  exports: [RouterModule],
  declarations: [],
  providers: [],
})
export class AppRoutingModule { }

main.js:

secondWindow = new BrowserWindow({
    parent: mainWindow,
    width: 1024,
    height: 768,
    frame: false,
    minWidth: 1024,
    minHeight: 768,
    show: false
  });

secondWindow.loadURL('file://' + __dirname + 'dist/contact');
secondWindow.show();

这导致出现以下错误信息:
Not allowed to load local resource: file:///C:/Me/Project/dist/contact

我尝试过以下方法,但都没有成功(包括使用哈希路由并设置 useHash: true):

secondWindow.loadURL('file://' + __dirname + '/dist/contact');
secondWindow.loadURL('file:' + __dirname + '/dist/contact');
secondWindow.loadURL('file:' + __dirname + 'dist/contact');
secondWindow.loadURL('file:' + __dirname + 'dist/index.html#/contact');

有什么想法吗?这是阻碍发布这个Electron应用的唯一障碍。

2个回答

17

没有看到您的代码和Angular设置,很难知道为什么它不起作用。但是您应该使用node.js pathurl模块来构建您的URL。

猜测,我会说您需要加载基本的HTML文件,并且哈希应该是您想要加载的路由:

const path = require('path');
const url = require('url');

window.loadURL(url.format({
  pathname: path.join(__dirname, './index.html'),
  protocol: 'file:',
  slashes: true,
  hash: '/contact'
}));

这将会得到类似于:

file:///full-path/to-your/app-root/index.html#/contact"

这意味着你的最后一个示例是最接近的,但是手动构建URL意味着它无效:

secondWindow.loadURL('file:' + __dirname + 'dist/index.html#/contact');


啊,我不知道哈希属性。因为它是我一直在开发的公司代码,所以我尽可能地给出了更多的代码。对于这个例子,我只是尝试在启动时直接加载路由,而不是遍历应用程序到路由位置。我一到工作就会尝试一下,并回复你。谢谢! - RockGuitarist1
我已经尝试了各种方式,但都没有成功。它基本上会将我重定向回到我的主页,或者抛出一个错误,说我不允许加载本地资源。您需要什么其他信息? - RockGuitarist1
好的,我记录了url.format正在创建的内容,这是我得到的URL:file:///C:\full-path\app-root\dist\index.html#/contact。看起来不太对。 - RockGuitarist1
我们Electron应用程序的URL(在开发模式下)看起来像这样:file:///C:\Users\tim\Documents\Repos\AppName\index.html - Tim
@RockGuitarist1 - 你解决了吗?我也有类似的问题,无法在子窗口中加载Angular路由。 - CoronaVirus
显示剩余7条评论

8
除了目前已经被接受的答案之外,我还需要在AppRoutingModule中打开useHash
@NgModule({
  imports: [RouterModule.forRoot(routes, { useHash: true })],
  exports: [RouterModule]
})

我之前没有设置任何路由,所以一直出现这个错误。不过现在问题已经解决了,谢谢。 - khollenbeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接