Пассивная ссылка в Angular 2 - ‹эквивалент href=›

В Angular 1.x я могу сделать следующее, чтобы создать ссылку, которая практически ничего не делает:

<a href="">My Link</a>

Но тот же тег переходит к базе приложения в Angular 2. Что эквивалентно этому тегу в Angular 2?

Изменить: это похоже на ошибку в маршрутизаторе Angular 2, и теперь есть открытый вопрос на github по этому поводу.

Я ищу нестандартное решение или подтверждение того, что его не будет.


person s.alem    schedule 25.02.2016    source источник
comment
Вы все еще можете. Это просто HTML. Какое-нибудь конкретное использование для этого?   -  person Sasxa    schedule 26.02.2016
comment
Да, это все еще действующий html, но эффект от Angular 1.x не тот.   -  person s.alem    schedule 26.02.2016
comment
Вы пробовали просто <a>, без HTML?   -  person Sasxa    schedule 26.02.2016
comment
Да, но браузер не относится к этому так же. Я знаю, что могу переопределить эффект курсора с помощью css и назначить указатель на все теги a. Но это выглядит хакерским.   -  person s.alem    schedule 26.02.2016
comment
Я считаю, что способ ng1 был неправильным (: поведение по умолчанию должно быть таким, как в стандартном html ...   -  person Sasxa    schedule 26.02.2016
comment
Полностью согласен с @Sasxa, если честно, это звучит как бесполезная функция. Почему фреймворк по умолчанию захватывает мой html и не позволяет ему работать должным образом?   -  person Eric Martinez    schedule 26.02.2016
comment
Я не уверен, как обрабатывать пассивные ссылки, но это не бесполезная функция, по крайней мере, для меня. Это очень удобно, например, когда вы хотите использовать ссылку для доступа к контроллеру.   -  person s.alem    schedule 26.02.2016
comment
@EricMartinez Я думаю, что проблема здесь не столько в том, должен ли Angular перехватывать поведение по умолчанию, а в том, что маршрутизатор Angular требует использования тега <base>, поэтому, когда вы нажимаете ссылку <a href="#">, а не переходите к #, вы попадаете на /# или как там у вас базовый href. Интересно посмотреть, как это повлияет на проблему с GitHub.   -  person lukiffer    schedule 04.07.2016
comment
У меня та же проблема, которую я решил с помощью ([routerLink] =). это в мопсе, что равно ‹a [routerLink ]=› ‹/a›   -  person Sharifullah Sharif    schedule 14.02.2017


Ответы (17)


Если у вас Angular 5 или выше, просто измените

<a href="" (click)="passTheSalt()">Click me</a>

в

<a [routerLink]="" (click)="passTheSalt()">Click me</a>

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

Примечание. Если вы хотите сохранить параметры запроса, установите для параметра queryParamsHandling значение preserve:

<a [routerLink]=""
   queryParamsHandling="preserve"
   (click)="passTheSalt()">Click me</a>
person Emiel Koning    schedule 02.08.2017
comment
Это генерирует href = # / at DOM (angular 4) - person Irfan Raza; 16.12.2017
comment
Это сработало [routerLink]="", оно отображается как <a href="null" (click)="myFunction()">My Link</a> Angular 5 в Chrome 64. - person Zymotik; 25.01.2018
comment
Я могу подтвердить, что тот же [routerLink]="" / href="null" работает в IE 11 - person Zymotik; 25.01.2018
comment
‹A [routerLink visible= (click)=passTheSalt()› Нажми меня ‹/a› работает в angular7. Я вижу ‹a (click)=passTheSalt()› Щелкните меня ‹/a› без routerLInk также работает в angular7. Какой лучший способ сделать пассивную якорную ссылку с использованием [routerLink] или без routerLink? - person Ian Poston Framer; 07.01.2019
comment
@IanPostonFramer Когда я удаляю [routerLink]="", текст Щелкните меня не отображается как ссылка и не показывает значок курсора в виде руки. - person Emiel Koning; 08.01.2019
comment
Почему бы просто не удалить href и ничего не заменить? У нас есть CSS, так что это сводит на нет заботу о стилях. - person MrBoJangles; 10.07.2019
comment
Принятый ответ приведет к сбросу положения прокрутки вверх, что может быть нежелательно во всех ситуациях. - person Christopher Taleck; 19.09.2019
comment
ВНИМАНИЕ: это сбросит ваши параметры URL. Покупатель, будь осторожен. - person Stavm; 22.09.2019
comment
А как насчет того, чтобы щелкнуть правой кнопкой мыши → Открыть в новой вкладке? Тот факт, что он на самом деле пытается перейти к / null в этот момент, заставляет меня устать от этого подхода. - person Kerry Johnson; 06.04.2020
comment
Используйте ‹a href= (click)=false› - person SUHAIL KC; 08.04.2020
comment
В Angular 11 он генерирует: <a href="(currentURL)">...</a>. При нажатии он не запускает никакого маршрута. - person andreivictor; 09.01.2021

Это будет то же самое, это не имеет отношения к angular2. Это простой тег html.

Обычно тег a (привязка) будет отображаться парсером HTML.

Изменить

Вы можете отключить это href, установив на нем javascript:void(0), чтобы с ним ничего не происходило. (Но это его взлом). Я знаю, что Angular 1 предоставил эту функциональность из коробки, что мне сейчас не кажется правильным.

<a href="javascript:void(0)" >Test</a>

Plunkr


Другой способ - использовать директиву routerLink с передачей значения "", которое в конечном итоге приведет к пустому href=""

<a routerLink="" (click)="passTheSalt()">Click me</a>
person Pankaj Parkar    schedule 25.02.2016
comment
@ s.alem, что бы вы ни говорили, наличие # внутри якоря href может повлиять на Angular1 маршрут ... может отправить вас на страницу по умолчанию (если она там) - person Pankaj Parkar; 26.02.2016
comment
Я знаю эффект # в angular 1.x. Мне нужна ссылка, которая ничего не делает в angular2, как href="" в angular 1.x. - person s.alem; 26.02.2016
comment
@ s.alem так <a href="">My Link</a> это сделает .. но что с ним сейчас происходит? - person Pankaj Parkar; 26.02.2016
comment
Он переходит к базе приложения, как я сказал в своей редакции. - person s.alem; 26.02.2016
comment
Да, это было бы решение, но выглядит хакерским. Я все еще чувствую, что должно быть нестандартное решение, как в angular 1.x. - person s.alem; 26.02.2016
comment
Эта запись может вызвать ошибки в консоли, fyi. например: XMLHttpRequest cannot load javascript:void(), Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. - person Max; 23.04.2017
comment
@John, похоже, это вызвано каким-то расширением chrome .. У меня также была проблема с моим приложением, когда мое приложение обрабатывало CORS, оно не получалось - person Pankaj Parkar; 23.04.2017
comment
@PankajParkar Интересно, но angular сообщает об ошибке. Мы отказались от использования элементов <a> без действительного href, слишком много проблем с маршрутизаторами Angular2, вместо этого мы используем элемент <span> с классом ссылок, и у нас все работает намного лучше. - person Max; 24.04.2017
comment
Не могли бы вы воспроизвести частное окно с этой ошибкой (так как расширение там не работает). В этом случае оно должно работать правильно .. - person Pankaj Parkar; 24.04.2017
comment
Вы можете отключить href менее хакерским способом, используя preventDefault, как описано здесь: stackoverflow.com/a/44465069/702783 - person Michael Kühnel; 02.10.2017
comment
Политика безопасности контента может заблокировать этот ответ, попробуйте [routerLink]="". Это вызовет рендеринг href="null". - person Zymotik; 25.01.2018
comment
[routerLink] = удалит параметры запроса из вашего маршрута, скорее всего, это не то, что вам нужно. Вы можете использовать параметры запроса preserve, но это кажется слишком большим - person narthur157; 26.02.2018
comment
Второй вариант не работает у меня в AngularDart, использование [routerLink]="" с (click)="navigateFunc(id)" отправит меня обратно в корень /. При отталкивании я получаю URL-адрес навигации, который хотел, а затем, если я снова нажимаю, я попадаю на свою исходную страницу. Браузер в основном обращается к обоим URL-адресам. - person Paul Carlton; 14.07.2019
comment
Однако вариант 1: href="javascript:void(0);" У меня ДЕЙСТВИТЕЛЬНО работает. - person Paul Carlton; 14.07.2019

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

Помимо разногласий, вы можете написать простую директиву, которая захватывает все ваши ссылки и проверяет содержимое href, и если его длина равна 0, вы выполняете preventDefault(), вот небольшой пример.

@Directive({
  selector : '[href]',
  host : {
    '(click)' : 'preventDefault($event)'
  }
})
class MyInhertLink {
  @Input() href;
  preventDefault(event) {
    if(this.href.length == 0) event.preventDefault();
  }
}

Вы можете заставить его работать во всем приложении, добавив эту директиву в PLATFORM_DIRECTIVES

bootstrap(App, [provide(PLATFORM_DIRECTIVES, {useValue: MyInhertLink, multi: true})]);

Вот plnkr с рабочим примером.

person Eric Martinez    schedule 26.02.2016
comment
Проголосуйте за глобальное угловое решение, но я не принимаю его как правильный ответ, потому что, как я уже сказал, я ищу только нестандартное решение, пока они не подтвердят, что его не будет, или пока мне действительно не понадобится Это. Но все же большое спасибо. - person s.alem; 27.02.2016
comment
Проблема с pointer-events заключается в отсутствии поддержки IE (caniuse) (я могу обойти это даже с IE11, как ни странно), и это не мешает щелкнуть ссылку из консоли. Я поддержал ответ @Pankaj, потому что это самый простой с моей точки зрения, мой ответ - это просто способ сделать это с помощью angular2, я мог бы упростить его, но селекторы css ограничены. - person Eric Martinez; 28.02.2016
comment
Кажется, это нарушает ссылки на вкладки начальной загрузки (например, ‹a href=#tab-id›) - person xd6_; 18.11.2016
comment
В каком модуле есть функция начальной загрузки? - person Jun711; 06.07.2017

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

<button type="button" class="btn btn-link" (click)="doSomething()">My Link</button>
person Jens Alenius    schedule 05.01.2017
comment
Мне нравится это решение. Если вы хотите, чтобы курсор показывал руку, добавьте style = cursor: pointer. - person newman; 02.04.2017
comment
Во многих ситуациях это хорошее решение, однако имейте в виду, что кнопка имеет большие размеры, чем просто привязка на основе текста. - person yankee; 01.04.2019
comment
@yankee, вы можете изменить это в css, но я не рекомендую ... факт в том, что кнопка - это кнопка, а ссылка - это ссылка ... слишком печально, что Интернет не такой белый или черный. - person Ayyash; 15.08.2019

Я использую этот обходной путь с css:

/*** Angular 2 link without href ***/
a:not([href]){
    cursor: pointer; 
    -webkit-user-select: none; 
    -moz-user-select: none; 
    user-select: none
}

html

<a [routerLink]="/">My link</a>

Надеюсь это поможет

person Sabri Aziri    schedule 02.12.2016
comment
Это лучшее решение, так как в основном отсутствует визуальный эффект. Вы можете поместить этот CSS в styles.css файл верхнего уровня проекта Angular, и он будет отлично работать! - person ; 04.11.2019

решение simeyla:

<a href="#" (click)="foo(); false">
<a href="" (click)="false">
person ali-myousefi    schedule 20.09.2017
comment
Это кажется самым простым и элегантным решением. - person Purple Piranha; 08.08.2018
comment
Простой ответ ???? - person SUHAIL KC; 08.04.2020
comment
просто верните false в функции, тогда вам не нужно запоминать это в каждом теге, в котором вы используете функцию. - person thenetimp; 09.03.2021

Вы запретили поведение браузера по умолчанию. Но для этого не нужно создавать директиву.

Это просто, как в следующем примере:

my.component.html

<a href="" (click)="goToPage(pageIndex, $event)">Link</a>

my.component.ts

goToPage(pageIndex, event) {
  event.preventDefault();
  console.log(pageIndex);
}
person Michael Kühnel    schedule 09.06.2017
comment
Это перейдет к обновлениям и не будет иметь дело с routerlink или нулевыми значениями. - person JoeCool; 09.03.2021

Вот простой способ

  <div (click)="$event.preventDefault()">
            <a href="#"></a>
   </div>

захватить всплывающее событие и сбить его

person born2net    schedule 20.01.2017
comment
Почему бы не использовать сам якорь для предотвращения поведения по умолчанию? Как описано здесь: stackoverflow.com/a/44465069/702783 Мне кажется менее «хакерским». - person Michael Kühnel; 02.10.2017

Обновлено для Angular 5

import { Directive, HostListener, Input } from '@angular/core';

@Directive({
  // tslint:disable-next-line:directive-selector
  selector : '[href]'
})
export class HrefDirective {
  @Input() public href: string | undefined;

  @HostListener('click', ['$event']) public onClick(event: Event): void {
    if (!this.href || this.href === '#' || (this.href && this.href.length === 0)) {
      event.preventDefault();
    }
  }
}
person CBarr    schedule 01.02.2018

Вот несколько способов сделать это:

  • <a href="" (click)="false">Click Me</a>

  • <a style="cursor: pointer;">Click Me</a>

  • <a href="javascript:void(0)">Click Me</a>

person Sal    schedule 04.08.2017

В моем случае удаление атрибута href решает проблему, если для файла.

person Michał Ignaszewski    schedule 27.03.2017

У меня есть 4 решения для фиктивного тега привязки.

    1. <a style="cursor: pointer;"></a>
    2. <a href="javascript:void(0)" ></a>
    3. <a href="current_screen_path"></a>

4. Если вы используете бутстрап:

<button class="btn btn-link p-0" type="button" style="cursor: pointer"(click)="doSomething()">MY Link</button>
person Nabin Kumar Khatiwada    schedule 17.04.2018

Очень простое решение - не использовать тег A - вместо этого используйте диапазон:

<span class='link' (click)="doSomething()">Click here</span>

span.link {
  color: blue;
  cursor: pointer;
  text-decoration: underline;
}
person Jonathan    schedule 12.04.2017
comment
Вы не должны делать этого в смысле семантической разметки. Используйте элемент button, если вы хотите doSomething на странице. - person Michael Kühnel; 09.06.2017
comment
<button> элементы по умолчанию запускают щелчок при нажатии клавиши space. Использование span (или <a>) удаляет эту функцию, поэтому действия с клавиатуры не будут работать должным образом. - person Drenai; 28.09.2019
comment
да, я ценю решение, но это затрудняет доступность для многих из нас - person runderworld; 07.08.2020
comment
Это никогда не бывает правильным решением. Интервалы предназначены для форматирования текста, якоря для связывания и навигации. Инструменты специальных возможностей обрабатывают это по-разному. - person thenetimp; 09.03.2021

Не уверен, почему люди предлагают использовать routerLink="", для меня в Angular 11 он запускает навигацию. Вот что у меня работает:

<div class="alert">No data yet, ready to <a href="#" (click)="create();$event.preventDefault()">create</a>?</div>
person Shrike    schedule 30.03.2021

Интересно, почему никто не предлагает routerLink и routerLinkActive (Angular 7)

<a [routerLink]="[ '/resources' ]" routerLinkActive="currentUrl!='/resources'">

Я удалил href и теперь использую это. При использовании href он переходил на базовый URL-адрес или снова загружал тот же маршрут.

person Monster Brain    schedule 22.12.2018

вам необходимо предотвратить поведение события по умолчанию следующим образом.

В html

<a href="" (click)="view($event)">view</a>

В файле ts

view(event:Event){
 event.preventDefault();
 //remaining code goes here..
}
person U_R_Naveen UR_Naveen    schedule 15.07.2020

Обновлено для Angular2 RC4:

import {HostListener, Directive, Input} from '@angular/core';

@Directive({
    selector: '[href]'
})
export class PreventDefaultLinkDirective {

    @Input() href;
    @HostListener('click', ['$event']) onClick(event) {this.preventDefault(event);}

    private preventDefault(event) {
        if (this.href.length === 0 || this.href === '#') {
            event.preventDefault();
        }
    }
}

С использованием

bootstrap(App, [provide(PLATFORM_DIRECTIVES, {useValue: PreventDefaultLinkDirective, multi: true})]);
person geejay    schedule 20.07.2016