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

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

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

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

Error: Cannot activate an already activated outlet

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

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

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

Связанная проблема с github github.com/angular/angular/issues/20694

Andreas 06.03.2020 11:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
1
36 408
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 есть эта проблема, но я не могу найти способ ее исправить ^^

Anthony Coucke 18.04.2019 11:27

Спасибо @Ли! Не происходит только при использовании отложенной загрузки — также происходит при использовании вспомогательных именованных маршрутизаторов. Просто примените исправление, которое отлично сработало, после нескольких дней стука в стену и попробуйте миллион способов сделать маршрутизацию по-другому - ни один не сработал, кроме этого исправления.

Pedro Ferreira 06.01.2020 11:59

У меня была эта проблема при попытке использовать именованные (вспомогательные) розетки маршрутизатора, и я нашел другой обходной путь: github.com/angular/angular/issues/20694#issuecomment-5957079‌​56

Andreas 06.03.2020 11:43

Просто не используйте именованные розетки на обеих дочерних розетках маршрутизатора. github.com/angular/angular/issues/20694#issuecomment-3644467‌​81

Wlada 07.04.2020 13:37

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

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

Я пропустил импорт модуля, ошибка исчезла после ввода этого модуля.

Sami 07.12.2019 03:04

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

B. León 09.12.2019 20:54

Спасибо, у меня были некоторые неопределенные переменные в привязках HTML-страниц, ошибки также отображались в консоли браузера.

Butterfly 05.01.2020 10:48

Спасибо. Присвоение значения по умолчанию в конструкторе внутреннего компонента решило эту проблему...

Cédric Françoys 04.12.2020 13:41

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

Итак, как указал @Andreas здесь (https://github.com/angular/angular/issues/20694#issuecomment-595707956). У меня не было назначенных компонентов для пустого пути, поэтому я предполагаю, что из-за этого он не мог каким-то образом деактивировать выход, поэтому я просто назначил пустой компонент для пути: "".

Первый способ: чтобы исправить это, я буду использовать пустой компонент для "" или неправдивых маршрутов.

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

Другой способ: если вы хотите, вы можете сделать это вместо закрытия представления

model.component.ts

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

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

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

Моя проблема заключалась в том, что у меня есть защита входа, которая выполняет перенаправление через this.router.navigate, а защита возвращала true после перенаправления.

Когда я изменил код для возврата false в случае перенаправления, проблема исчезла.

Другие вопросы по теме