【问题标题】:Angular 6/7 Auxiliary outlet navigating to by route - clears primary outlet and it shouldn'tAngular 6/7 辅助出口按路线导航 - 清除主出口,它不应该
【发布时间】:2023-03-15 23:56:02
【问题描述】:

延迟加载和使用命名的插座。我已经按预期加载了命名的插座,但是当它加载时,它也在清除主插座。我希望主插座保留它正在显示的组件,并且只更改命名插座以显示新组件。

感谢@pixelbits 的一些帮助...这是一个不起作用的示例https://stackblitz.com/edit/angular-sw6cmc

我不想改变主要出口。

html

<router-outlet></router-outlet>
<router-outlet name="dialogOutlet"></router-outlet>

路线:

 {    
    path: 'packoutdialog'
    , children:[
      {path:'', outlet:'dialogOutlet', component: PackoutComponent}]

  },

其中任何一个都将填充 dialogOutlet 但清除主要

 this.router.navigate(['inventory', 'packoutedialog'])
this.router.navigate(['packoutdialog',{outlets:{'dialogOutlet':[]}}],{skipLocationChange: true, relativeTo: this.activatedRoute.parent});

这似乎应该有效,但没有。

this.router.navigate([{outlets:{'dialogOutlet':['inventory','packoutdialog']}}])

预期结果是主路由器出口将视图保留在其中,只有命名出口发生变化。目前,命名的出口正在按预期发生变化,但主要出口正在被清除。

【问题讨论】:

    标签: angular routing lazy-loading angular-auxiliary-routes


    【解决方案1】:

    当您同时拥有主出口和辅助出口时,您需要确保两条路由都完全解析为一个组件。实际上,您应该单独考虑每条路由路径。

    例如,如果您有一个组件,它设置了一个路由器出口和一个命名的路由器出口:

    <router-outlet></router-outlet>
    <router-outlet name="dialogOutlet"></router-outlet>
    

    那么你需要确保每条路由都可以解析为一个组件:

    { path: 'inventory', component: InventoryComponent, children: [...] }, 
    { path: 'packoutdialog', component: PackoutComponent, outlet: 'dialogOutlet' }
    

    请注意,命名出口dialogOutletpackoutdialog 路由需要在根级别定义。如果您将命名的出口定义为子路由,它将永远无法解析。

    导航到这些路线:

    this.router.navigate([{ outlets: { primary: 'inventory', dialogOutlet: 'packoutdialog'} }]);
    

    主路由将解析为 InventoryComponent,命名出口将解析为 PackoutComponent。

    要清除对话框,您可以为两者明确指定路径:

    this.router.navigate([{ outlets: { primary: 'inventory', dialogOutlet: null}]);
    

    或者,如果您希望无论主路由如何都能够显示dialogOutlet,您可以在不明确定义主路由的情况下进行导航:

    this.router.navigate([{ outlets: { dialogOutlet: 'packoutdialog'}]);
    

    然后清除对话框:

    this.router.navigate([{ outlets: { dialogOutlet: null }]);
    

    Demo

    上述方法也适用于延迟加载的模块。

    Demo with Lazy Module 1 Demo with Lazy Module 2

    【讨论】:

    • 那会很棒但是这个 - { path: 'packoutdialog', component: PackoutComponent, outlet: 'dialogOutlet' } - 当你有延迟加载时不起作用。我在github.com/angular/angular/issues/10981#issuecomment-301787482 找到了让空孩子带插座的诀窍。一旦我用空的孩子做这件事,它确实有效,但我只想更换出口路由器盒,只是不想改变主要的。我不想重新装满它,我只想让它保持原有的状态。
    • 你可以在我的问题中看到我已经尝试过 this.router.navigate([{ outlets: { dialogOutlet: 'packoutdialog'}]);以及我认为应该有效的其他迭代,但它没有。我相信这就是问题所在。使用我的路线,我无法弄清楚如何使用 outlets 语法来调用它。它确实使用父路由到达出口,但随后主路由被清除。
    • 这也适用于延迟加载的模块。检查上面的演示链接。
    • 有趣...我试着用它来展示我想要做什么。我在短时间内没有成功。我希望在不更改主组件的情况下更改辅助组件,并且主组件和辅助组件是延迟加载模块的一部分。我真的很感激你所有的时间。我会回到这个来安排这个问题——希望明天。非常感谢您抽出宝贵的时间。我真的很想更好地理解这一点,并深入了解我(希望)做错了什么。它可能在这里。我保证很快就会回来。
    • 我能够复制我的问题stackblitz.com/edit/angular-sw6cmc 我拿了你的演示并将 foo、component1 和 component2 移动到延迟加载模块。我证明,如果它没有辅助插座,它确实可以工作,如果它有辅助插座,它不会。请让我知道我在这里缺少什么。
    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2018-01-23
    • 2019-06-04
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多