Angular 2의 수동 링크-<a href=“”> 동등


140

Angular 1.x에서는 기본적으로 아무것도하지 않는 링크를 만들기 위해 다음을 수행 할 수 있습니다.

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

그러나 동일한 태그는 Angular 2의 앱 기반으로 이동합니다. Angular 2와 동일한 태그는 무엇입니까?

편집 : Angular 2 Router의 버그처럼 보이며 이제 github공개 문제 가 있습니다.

즉시 사용 가능한 솔루션이나 아무것도 없다는 확인을 찾고 있습니다.


여전히 할 수 있습니다. 그냥 HTML입니다. 그것에 특별한 사용?
Sasxa

예, 여전히 유효한 HTML이지만 효과는 Angular 1.x와 동일하지 않습니다.
s.alem

1
<a>"html"없이 그냥 시도 했습니까 ?
Sasxa

3
예, 그러나 브라우저는 동일한 방식으로 처리하지 않습니다. CSS로 커서 효과를 무시하고 모든 a태그에 포인터를 할당 할 수 있다는 것을 알고 있습니다 . 그러나 그것은 해키 보인다.
s.alem

3
내 의견은 (잘못된 방향으로 그 NG1의 방법이었다 : 그것은 ... 표준 HTML에서와 같이 기본 동작을해야한다
Sasxa

답변:


187

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>

2
이 작업 [routerLink]=""으로는 렌더링 <a href="null" (click)="myFunction()">My Link</a>크롬 64에서 각도 5
Zymotik

3
나는 같은 것을 확인할 수 있습니다 [routerLink]=""/ href="null"IE 11에서 작동
Zymotik

1
<a [routerLink]="" (click)="passTheSalt()"> 클릭하십시오 </a>는 angular7에서 작동합니다. routerLInk가없는 <a (click)="passTheSalt()"> 클릭하십시오 </a>는 angular7에서도 작동합니다. [routerLink]를 사용하거나 routerLink를 사용하지 않는 수동 앵커 링크를 만드는 더 좋은 방법은 무엇입니까?
이안 포스트 프레이머

1
@IanPostonFramer 제거 할 때 클릭하십시오[routerLink]="" 라는 텍스트 가 링크로 표시되지 않고 손 모양 커서 아이콘이 표시되지 않습니다.
Emiel Koning 2018 년

5
주의 사항 : URL 매개 변수가 재설정됩니다. 구매자는 조심하십시오.
Stavm

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(자신이 경우) 페이지를 기본값으로 보내 route..may
판 카즈 Parkar

1
#각도 1.x 의 효과를 알고 있습니다 . href=""angular 1.x 와 마찬가지로 angular2에서 아무것도하지 않는 링크를 원합니다 .
s.alem

@ s.alem은 그렇게 <a href="">My Link</a>할 것입니다.하지만 현재 어떻게되고 있습니까?
Pankaj Parkar

1
[routerLink] = ""는 경로에서 검색어 매개 변수를 제거합니다. 원하는 것은 아닐 것입니다. 당신은 보존 쿼리 매개 변수를 사용할 수 있지만, 너무 멀리가는 것 같습니다
narthur157

2
그러나 옵션 1 : href="javascript:void(0);"DOES가 효과가 있습니다.
Paul Carlton

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 입니다.


글로벌 앵귤러 솔루션에 대한 찬성이지만, 내가 말했듯이 실제로 상자가 필요하지 않거나 실제로 필요할 때까지 아웃 박스 솔루션 만 찾고 있기 때문에 정답으로 받아들이지 않습니다. 그것. 그러나 여전히 감사합니다.
s.alem

2
문제 pointer-events는 IE ( caniuse ) 에 대한 지원이 없다는 것입니다 ( IE11로도 우회 할 수 있습니다) . 콘솔에서 링크 를 클릭 하는 것을 막지 못합니다 . @ Pankaj 대답은 내 관점에서 가장 쉬운 답변이기 때문에 upvoted했습니다. 제 답변은 angular2로 수행하는 방법입니다. 쉽게 만들 수는 있지만 CSS 선택기는 제한적입니다.
Eric Martinez

1
이것은 부트 스트랩 탭 링크를 끊는 것 같습니다 (예 : <a href="#tab-id">)
xd6_

부트 스트랩 기능은 어떤 모듈입니까?
Jun711

16

앵커는 무언가를 탐색해야하므로 경로가 올 때 동작이 올바른 것 같습니다. 페이지에서 무언가를 토글 해야하는 경우 버튼과 더 비슷합니까? 부트 스트랩을 사용하여 다음을 사용할 수 있습니다.

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

1
나는이 해결책을 좋아한다. 커서가 손을 보이도록하려면 style = "cursor : pointer"를 추가하십시오.
newman

그러나 많은 경우에 좋은 해결책은 버튼이 텍스트 기반 앵커보다 크기가 더 크다는 점에 유의하십시오.
yankee

@ yankee CSS로 변경할 수는 있지만 권장하지는 않습니다 ... 사실은 버튼은 버튼이고 링크는 링크입니다 ... 너무 슬픈 웹은 흰색이나 검은 색이 아닙니다.
Ayyash 2018 년

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를 Angular 프로젝트의 최상위 styles.css파일 에 넣으면 훌륭하게 작동합니다!


5

정말 간단한 해결책은 A 태그를 사용하지 않는 것입니다. 대신 span을 사용하십시오.

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

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

당신은 sematic markup의 의미에서 그렇게해서는 안됩니다. 페이지에서 button원하는 경우 요소를 사용 doSomething하십시오.
Michael Kühnel

<button>space키를 누르면 기본적으로 요소가 클릭을 트리거 합니다. 사용 span(또는 <a>)이 기능을 제거합니다 - 그래서 키보드 액션이 기대됩니다없는 작품으로
Drenai

4

여기 간단한 방법이 있습니다

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

버블 링 이벤트를 캡처하고 격추


기본 동작을 방지하기 위해 앵커 자체를 사용하지 않는 이유는 무엇입니까? 여기에 설명 된 것처럼 : stackoverflow.com/a/44465069/702783 나에게 덜»hacky«인 것 같습니다.
Michael Kühnel

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

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();
    }
  }
}

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>


어쩌면 그러한 기술이 나쁜 이유는 무엇입니까?
grigson

1
클릭을 원치 않을 때 코드 어디에나 클릭을 작성하는 것은 나쁘다
Jens Alenius

2
그러나 이것은 정확히 내가하고 싶은 일입니다 : 코드에서 장소를 "클릭시 아무것도"로 표시하지만 새로운 구문을 지원하십시오. onclick = "javascript : void"와 같은 구성은 실제로 추악합니다. href = "#"은 뷰포트를 맨 위로 이동할 수 있으므로 신뢰할 수 없습니다. 그래서 더 나은 대안을 볼 수 없습니다
grigson

나는 당신의 해결책을 좋아합니다. 감사합니다.
Mai Hữu Lợi

새로운 답변을 확인하십시오. 앵커가 버튼 '유형'을 탐색하지 않게하려면
Jens Alenius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.