Angular 7 - Несколько розеток: ошибка: невозможно активировать уже активированную розетку

Вот проблема, с которой я сталкиваюсь с Angular 7:

У меня есть две розетки: основная розетка роутера приложений и вторичная розетка под названием «администрирование».

Когда я хочу перейти по любой административной ссылке при запуске, она работает нормально. Но в следующий раз, когда я пытаюсь ориентироваться, angular выдает это сообщение об ошибке:

Ошибка: не удается активировать уже активированную розетку

Итак, может кто-нибудь объяснить мне, почему? На форумах решения не нашел ...

Вот стекблиц: https://stackblitz.com/edit/angular-osnnd4

Всем спасибо :)


person Anthony Coucke    schedule 10.04.2019    source источник
comment
Связанная проблема с github github.com/angular/angular/issues/20694   -  person Andreas    schedule 06.03.2020


Ответы (4)


Проблема возникает при ленивой загрузке дочерних маршрутов. Вы должны вручную отключать розетку каждый раз, когда меняете маршрут.

Я изменил ваш компонент 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();
    });
  }
}
person Lee GuoHong    schedule 18.04.2019
comment
Спасибо, Ли, я попробую это дома :) Да, я читал во многих ветках, что у Angular есть эта проблема, но я не могу найти способ ее исправить ^^ - person Anthony Coucke; 18.04.2019
comment
Спасибо @Lee! Это происходит не только при использовании отложенной загрузки, но и при использовании дополнительных именованных маршрутизаторов. Просто примените исправление, которое отлично сработало, после нескольких дней ударов по стене и попробуйте миллион способов изменить маршрутизацию - ни один из них не сработал, кроме этого исправления. - person Pedro Ferreira; 06.01.2020
comment
У меня возникла эта проблема при попытке использовать именованные (вспомогательные) розетки маршрутизатора, и я нашел другой обходной путь: github.com/angular/angular/issues/20694#issuecomment-595707956 - person Andreas; 06.03.2020
comment
Только не используйте именованные розетки на обеих розетках дочернего маршрутизатора. github.com/angular/angular/issues/20694#issuecomment-364446781 - person Wlada; 07.04.2020

Это может быть глупо, но для тех, кто ищет решение этой проблемы: убедитесь, что in нет неопределенной переменной ни в одном из внутренних или дочерних выходов.

Я исправил это в своем проекте, и все вернулось к норме.

person B. León    schedule 14.11.2019
comment
Мне не хватало импорта модуля, ошибка исчезла после добавления этого модуля. - person Sami; 07.12.2019
comment
да, я игнорирую, было бы правильно расставлять приоритеты неопределенным переменным ошибкам вместо того, чтобы бросать довольно загадочную Не удалось активировать розетку - person B. León; 09.12.2019
comment
Спасибо, у меня были некоторые неопределенные переменные в привязках HTML-страниц, ошибки также отображались в консоли браузера. - person Butterfly; 05.01.2020
comment
Спасибо. Назначение значения по умолчанию во внутреннем конструкторе компонента решило эту проблему ... - person Cédric Françoys; 04.12.2020

Моя проблема: в основном моя именованная розетка не деактивировалась, в моем случае я бы использовал ее для нескольких разных модальных окон, и хотя деактивация моей модальной розетки вручную работала, она не работала при загрузке другого пути и того же компонента в розетку, поэтому Я не мог переработать свой компонент, в моем случае модальный компонент.

Как указано здесь @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 с неправдивыми маршрутами, поэтому мне просто пришлось сопоставить их с нулевыми значениями.

person Miguel Angel Romero Hernandez    schedule 13.05.2020

Тщательно проверьте, импортировали ли вы отложенный модуль в его родительский модуль или какой-либо другой модуль, независимо от маршрутизации. Если это так, удалите его импорт оттуда. Так было в моем случае.

person Dikshit Sharma    schedule 06.01.2021