【问题标题】:Angular 7 - Multiple outlets : Error: Cannot activate an already activated outletAngular 7 - 多个插座:错误:无法激活已激活的插座
【发布时间】:2019-09-01 05:17:25
【问题描述】:

这是我在使用 Angular 7 时遇到的问题:

我有两个插座:主应用路由器插座和一个名为“管理”的辅助插座。

当我想在开始时浏览任何管理链接时,它工作正常。但是下次,当我尝试导航时,angular 会抛出此错误消息:

错误:无法激活已激活的插座

那么,有人可以解释一下为什么吗?我在论坛上没有找到任何解决方案...

这是一个堆栈闪电战:https://stackblitz.com/edit/angular-osnnd4

谢谢大家:)

【问题讨论】:

标签: angular7 children router-outlet routerlink


【解决方案1】:

我的问题是我有一个登录守卫,它通过this.router.navigate 执行重定向,并且守卫在重定向后返回true

当我将代码更改为在重定向的情况下返回 false 时,问题已经消失了。

【讨论】:

    【解决方案2】:

    我的问题: 基本上我的命名插座没有停用,在我的情况下,我会将它用于一堆不同的模态,虽然手动停用我的模态插座会起作用,但在将不同的路径和相同的组件加载到插座时它不起作用所以我不能回收我的组件,在我的例子中是模态组件。

    正如@Andreas 在这里指出的那样 (https://github.com/angular/angular/issues/20694#issuecomment-595707956)。我没有为空路径分配任何组件,所以我猜测它无法以某种方式停用插座,所以我只是为路径分配了一个emptyComponent:“”。

    第一种方法:为了解决这个问题,我将为 "" 或非真实路由使用空组件

    app-router-module.ts
    ...
     {
        outlet: "modal",
        path: "", 
        component: EmptyComponent, 
      },
    ...
    

    另一种方式:如果你愿意,你可以在关闭视图时这样做

    model.component.ts
    
    this.router.navigate([
      {
        outlets: {
          modal: null,
        },
      },
    ]);
    
    

    无论哪种方式,路由器都会停用,但我认为您应该使用第二个示例,因为它会停用并破坏视图。就我而言,我有一个带有非真实路由的 json,所以我只需要将它们映射到空值。

    【讨论】:

      【解决方案3】:

      彻底检查您是否在其 父模块 或其他模块中导入了 延迟加载模块,而与路由无关。如果是这样,请从那里删除其导入对我来说就是这样。

      【讨论】:

        【解决方案4】:

        这可能很愚蠢,但对于任何寻求解决方案的人来说: 确保在任何内部或子出口中都没有未定义的变量。

        我在我的项目中修复了这个问题,一切都恢复正常了。

        【讨论】:

        • 我错过了一个模块导入,导入该模块后错误消失了。
        • 是的,我忽略了优先考虑未定义的变量错误是否有效,而不是抛出一个相当神秘的无法激活出口
        • 谢谢,我在 HTML 页面绑定中有一些未定义的变量,错误也显示在浏览器控制台中。
        • 谢谢。在内部组件构造函数中分配一个默认值解决了这个问题...
        【解决方案5】:

        延迟加载子路由时会出现问题。每次更改路线时,您都必须手动停用插座。

        我已将您的 AdministrationComponent 修改为以下解决方法。它现在应该可以工作,直到 Angular 找到解决问题的方法。

        import { Component, OnInit, ViewChild } from '@angular/core';
        import { RouterOutlet, Router, ActivationStart } from '@angular/router';
        
        @Component({
          selector: 'app-administration',
          templateUrl: './administration.component.html',
          styleUrls: ['./administration.component.css']
        })
        export class AdministrationComponent implements OnInit {
        
          @ViewChild(RouterOutlet) outlet: RouterOutlet;
        
          constructor(
            private router: Router
          ) { }
        
          ngOnInit(): void {
            this.router.events.subscribe(e => {
              if (e instanceof ActivationStart && e.snapshot.outlet === "administration")
                this.outlet.deactivate();
            });
          }
        }
        

        【讨论】:

        • 谢谢李,我会在家里试试 :) 是的,我在很多帖子中读到 Angular 有这个问题,但我找不到解决方法 ^^
        • 谢谢@Lee!不仅在您使用延迟加载时发生 - 当您使用辅助命名路由器时也会发生。只需应用修复程序,该修复程序效果很好,经过几天的努力,并尝试了一百万种不同的路由切换方式 - 除了这个修复程序之外,没有任何一种方法有效。
        • 我在尝试使用命名(辅助)路由器插座时遇到了这个问题,并找到了另一种解决方法:github.com/angular/angular/issues/20694#issuecomment-595707956
        • 只是不要在两个子路由器插座上使用命名插座。 github.com/angular/angular/issues/20694#issuecomment-364446781
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 2014-11-05
        • 2022-10-21
        相关资源
        最近更新 更多