Пасивна посилання в кутовому куті 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.