В моем приложении Angular 2 я пытаюсь отключить routerLink без каких-либо успехов. Я попытался обработать событие click в событии click
(с event.preventDefault()
и event.stopPropagation()
), но он не работает.
Как отключить routerLink?
В моем приложении Angular 2 я пытаюсь отключить routerLink без каких-либо успехов. Я попытался обработать событие click в событии click
(с event.preventDefault()
и event.stopPropagation()
), но он не работает.
Как отключить routerLink?
Отключение pointer-events
на
<a [routerlink]="xxx" [class.disabled]="disabled ? true : null">Link</a>
a.disabled {
pointer-events: none;
cursor: default;
}
См. также Angular2, каков правильный способ отключения элемента привязки?
или
<a *ngIf="isEnabled" [routerlink]="xxx">Link</a>
<div *ngIf="!isEnabled">not a link</div>
или для простого повторного использования шаблона отключенной ссылки
<ng-template #disabledLink>
<div *ngIf="!isEnabled">not a link</div>
</ng-template>
<a *ngIf="isEnabled; else disabledLink" [routerlink]="xxx">Link</a>
Шаблон:
<a [routerLink]="homeLinkEnabled ? '/home' : null" routerLinkActive="is-active">Home</a>
Необязательный CSS:
.is-active {
cursor: default;
text-decoration: none;
}
Описание:
Когда homeLinkEnabled
возвращает false
, null
заставит routerLink
связываться с текущим/активным маршрутом.
Если routerLink
ссылается на активный маршрут, будет применен класс, указанный в routerLinkActive
.
Там мы можем указать, как должен выглядеть отключенный routerLink.
routerLink
к активному маршруту не вызовет событие навигации.
У меня только что был некоторый успех с похожей проблемой: наличие массива ссылок навигации в ngFor, некоторые требовали [routerLink], а другие требовали (click) - моя проблема заключалась в том, что все ссылки полагались на [routerLink] для [routerLinkActive], поэтому мне пришлось остановить routerLink, не трогая его значение.
'<a [routerLink]="item.link" routerLinkActive="isActive">
<span (click)="item.click ? item.click($event) : void>
</a>'
с:
'click: ($event) => {
$event.stopPropagation(); // Only seems to
$event.preventDefault(); // work with both
// Custom onClick logic
}'
Поскольку интервал находится внутри, вы можете быть уверены, что отмена события произойдет до того, как оно всплывет до [routerLink], в то время как routerLinkActive будет по-прежнему применяться.
Отключение pointer-events
на любом HTML-теге:
<div [routerLink]="['/home', { foo: bar }]"
[ngStyle]="{'pointer-events': myLinkEnabled ? 'none' : null}">
Click me
</div>
'none'
разрешает отключение pointer-events
, то есть отключение ссылки.
null
разрешает игнорировать стиль.
Вы можете решить, будет ли директива routerLink
отображаться на основе условия.
В шаблоне:
<a [attr.routerLink]="isDisabled ? null : ''"></a>
Когда значение равно null
, директива routerLink
не будет отображаться в элементе.
В вашем файле компонента:
get isDisabled() {
return ... // logic for when the routerLink should be disabled
}
К сожалению, похоже, что Angular не поддерживает значение value support for the routerLink.
Тем не менее, это работает для меня. Пример реализации моего меню:
<div *ngFor="let category of categories" [routerLink]="category.subcategories ? [] : [category.link]" (click)="toggleSubcategories(category)">
Проще говоря, если в категории есть подкатегории, не перенаправляйте, а открывайте подкатегории.
Отключить щелчок по условию, используя следующий простой CSS
.disable-anchor {
pointer-events: none;
}
<a [routerlink]="link" [ngClass]="{'disable-anchor' : condition}">Link</a>