Пасивна посилання в кутовому куті 2 - <a href= існуючої> еквівалент


140

У Angular 1.x я можу зробити наступне, щоб створити посилання, яке в принципі нічого не робить:

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

Але той самий тег переходить до бази додатків у куті 2. Що еквівалентно тому в Angular 2?

Редагувати: Це схоже на помилку в маршрутизаторі Angular 2, і тепер на Github існує проблема .

Я шукаю рішення, яке не існує, або підтвердження того, що його не буде.


Ти ще можеш. Це просто html. Якесь особливе використання для цього?
Сакса

Так, це все ще дійсний html, але ефект не однаковий з Angular 1.x.
с.алем

1
Ви пробували просто <a>, без "html"?
Сакса

3
Так, але браузер не ставиться до цього так само. Я знаю, що я можу замінити, тобто ефект курсору з css, і призначити покажчик усім aтегам. Але це виглядає хакі.
с.алем

3
Моя думка, що спосіб ng1 був неправильним (: Поведінка за замовчуванням має бути такою, якою вона є у стандартній html ...
Сакса

Відповіді:


187

Якщо у вас кутовий 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>

2
Це працювало, [routerLink]=""воно <a href="null" (click)="myFunction()">My Link</a>
виглядає

3
Я можу підтвердити те саме [routerLink]=""/ href="null"працює в IE 11
Zymotik

1
<a [routerLinkSense="" (click)="passTheSalt()"> Клацніть на мене </a> працює в кутку7. Я бачу <a (click)="passTheSalt()"> Клацніть на мене </a> без маршрутизатораLInk також працює в angular7. що є кращим способом зробити пасивне якірне з'єднання за допомогою [routerLink] чи без routerLink?
Ian Poston Framer

1
@IanPostonFramer Коли я видаляю [routerLink]="", текст Клацніть мене не відображається як посилання та не відображає значок курсору руки.
Еміель Конінг

5
ПРИМІТКА: це скине параметри вашої URL-адреси. остерігайтеся покупця.
Ставм

88

Це буде те саме, це не має нічого спільного angular2. Це простий тег html.

В основному a(якірний) тег буде наданий HTML-аналізатором.

Редагувати

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

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

Плункр


Іншим способом може бути використання routerLinkдирективи з прохідним ""значенням, яке з часом генерує порожнєhref=""

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

@ s.alem, що коли-небудь ви говорите, що наявність #якоря hrefможе вплинути на Angular1маршрут. Можливо, надішлемо вас на сторінку за замовчуванням (якщо така є)
Pankaj Parkar

1
Я знаю ефект #у кутовій 1.х. Я хочу посилання, яке нічого не робить в angular2, як і href=""в 1.x.
s.alem

@ s.alem так <a href="">My Link</a>зробить це ... але що з ним зараз відбувається?
Pankaj Parkar

1
[routerLink] = "" видалить параметри запитів із вашого маршруту, ймовірно, це не те, що ви хочете. Ви можете використовувати параметри збереження запитів, але це здається занадто далеко
narthur157,

2
Однак варіант 1: чи href="javascript:void(0);"працює для мене.
Пол Карлтон

21

Існують способи зробити це з 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 з прикладом роботи.


Обґрунтування глобального, кутового рішення, але я не сприймаю це як правильну відповідь, тому що, як я вже сказав, я шукаю лише рішення, яке не виходить, доки вони не підтвердять, що його не буде, або поки мені дійсно не потрібно це. Але все-таки дуже дякую.
с.алем

2
Проблема pointer-eventsполягає в недостатній підтримці IE ( каніуси ) (я можу обійти її навіть досить дивно IE11), і це не заважає клацнути посилання з консолі. Я відповів на @Pankaj відповідь, тому що це найпростіший з моєї точки зору, моя відповідь - це просто спосіб зробити це з angular2, я міг би зробити це простіше, але вибір css обмежений.
Ерік Мартінес

1
Здається, це порушує посилання на вкладку завантажувальної програми (наприклад, <a href="#tab-id">)
xd6_

У якому модулі функція завантаження?
7

16

Якір повинен орієнтуватися на щось, тому я гадаю, що поведінка є правильною, коли він рухається. Якщо вам це потрібно, щоб перемикати щось на сторінці, це більше нагадує кнопку? Я використовую завантажувальний інструмент, щоб я міг використовувати це:

<button type="button" class="btn btn-link" (click)="doSomething()">My Link</button>

1
Мені подобається це рішення. Якщо ви хочете, щоб курсор показав руку, додайте style = "cursor: pointer".
новачок

У багатьох ситуаціях добре рішення, однак пам’ятайте, що кнопка має більші розміри, ніж просто текстовий якір.
янкі

@yankee ви можете змінити це в css, але я не рекомендую ... адже факт, кнопка - це кнопка, а посилання - посилання ... занадто сумно, що Інтернет не такий білий чи чорний.
Айяш

11

Я використовую цей спосіб вирішення за допомогою 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>

Сподіваюся, це допомагає


1
Це краще рішення, оскільки відсутній в основному візуальний ефект. Ви можете помістити цей CSS у styles.cssфайл верхнього рівня Angular проекту, і він буде чудово працювати!


5

По-справжньому просте рішення - не використовувати тег A - скоріше використовувати проміжок:

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

span.link {
  color: blue;
  cursor: pointer;
  text-decoration: underline;
}

Не слід робити цього в сенсі сематичної розмітки. Використовуйте buttonЕлемент у випадку, якщо ви хочете перейти doSomethingна сторінку.
Майкл Кюнель

<button>елементи запускають клацання за замовчуванням при spaceнатисканні клавіші. Використання span(або <a>) видаляє цю функцію - тому дії клавіатури не працюватимуть, як очікувалося
Drenai

4

Ось простий спосіб

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

зафіксуйте бурхливий випадок і збийте його


Чому б не використовувати сам якор для запобігання поведінці за замовчуванням? Як описано тут: stackoverflow.com/a/44465069/702783 Здається менше »Hacky« до мене.
Майкл Кюнель

4

Ось кілька способів зробити це:

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

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

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



3

Ви запобігаєте поведінці браузера за замовчуванням. Але для цього не потрібно створювати директиву.

Це легко як наступний приклад:

my.component.html

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

my.component.ts

goToPage(pageIndex, event) {
  event.preventDefault();
  console.log(pageIndex);
}

3

Оновлено для кутового 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();
    }
  }
}

3

У мене є 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>

0

Цікаво, чому ніхто не пропонує routerLink та routerLinkActive (Angular 7)

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

Я видалив href і зараз використовую цей. Використовуючи href, він збирався до базової URL-адреси або знову завантажував той самий маршрут.


0

вам потрібно запобігти поведінці за замовчуванням події таким чином.

У html

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

У файлі ts

view(event:Event){
 event.preventDefault();
 //remaining code goes here..
}

-1

Оновлено для 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})]);

-1

Дійсно просте рішення (click)="(null)"

<a class="btn btn-default" (click)="(null)">Default</a>


може, будь-який коментар, чому така техніка погана?
григсон

1
Писати клацання скрізь у коді, коли не хочеться клацання - це погано
Єнс Аленіус

2
але це саме те, що я хочу зробити: позначити місце в коді як "нічого при натисканні", здатне, але підтримую новий синтаксис. Конструкції, такі як onclick = "javascript: void", справді некрасиві. І href = "#" недостовірні, оскільки можуть перескакувати ваш огляд наверх. Тож я не бачу кращих альтернатив
григсон

Мені подобається ваше рішення. Дякую.
Mai Hợu Lợi

Перевірте мою нову відповідь. Якщо ви не хочете, щоб якор орієнтувався на його кнопці "набрати"
Jens Alenius
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.