Вот проблема, с которой я сталкиваюсь с Angular 7:
У меня есть два выхода: основной выход маршрутизатора приложений и дополнительный выход под названием «Администрирование».
Когда я хочу перейти по любой административной ссылке при запуске, она работает нормально. Но в следующий раз, когда я пытаюсь перемещаться, angular выдает это сообщение об ошибке:
Error: Cannot activate an already activated outlet
Итак, может кто-нибудь объяснить мне, почему? На форумах решения не нашел...
Вот стек-блиц: https://stackblitz.com/edit/angular-osnnd4
Всем спасибо :)
Проблема возникает при ленивой загрузке дочерних маршрутов. Вы должны вручную деактивировать розетку каждый раз, когда меняете маршрут.
Я изменил ваш 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 есть эта проблема, но я не могу найти способ ее исправить ^^
Спасибо @Ли! Не происходит только при использовании отложенной загрузки — также происходит при использовании вспомогательных именованных маршрутизаторов. Просто примените исправление, которое отлично сработало, после нескольких дней стука в стену и попробуйте миллион способов сделать маршрутизацию по-другому - ни один не сработал, кроме этого исправления.
У меня была эта проблема при попытке использовать именованные (вспомогательные) розетки маршрутизатора, и я нашел другой обходной путь: github.com/angular/angular/issues/20694#issuecomment-595707956
Просто не используйте именованные розетки на обеих дочерних розетках маршрутизатора. github.com/angular/angular/issues/20694#issuecomment-364446781
Это может быть глупо, но для тех, кто ищет решение этой проблемы: Убедитесь, что ни в одном из внутренних или дочерних выходов нет неопределенной переменной.
Я исправил это в своем проекте, и все вернулось в норму.
Я пропустил импорт модуля, ошибка исчезла после ввода этого модуля.
да, я не обращаю внимания на то, будет ли правильно расставлять приоритеты при ошибках с неопределенными переменными вместо того, чтобы выдавать довольно загадочное сообщение «Не удалось активировать розетку».
Спасибо, у меня были некоторые неопределенные переменные в привязках HTML-страниц, ошибки также отображались в консоли браузера.
Спасибо. Присвоение значения по умолчанию в конструкторе внутреннего компонента решило эту проблему...
Моя проблема: По сути, мой именованный выход не деактивировался, в моем случае я бы использовал его для множества разных модальных окон, и хотя ручная деактивация моего модального выхода работала, она не работала при загрузке другого пути и того же компонента в выход, поэтому я не мог переработайте мой компонент, в моем случае модальный компонент.
Итак, как указал @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
в случае перенаправления, проблема исчезла.
Связанная проблема с github github.com/angular/angular/issues/20694