Angular2에서 외부 URL로 리디렉션하는 방법은 무엇입니까?


173

Angular 2에서 사용자를 완전히 외부 URL로 리디렉션하는 방법은 무엇입니까? 예를 들어 인증을 위해 사용자를 OAuth2 서버로 리디렉션해야하는 경우 어떻게해야합니까?

Location.go(), Router.navigate()Router.navigateByUrl()각이 응용 프로그램 내에서 다른 섹션 (경로)에 사용자를 보내기위한 좋은,하지만 난 그들이 외부 사이트로 리디렉션하는 데 사용할 수있는 방법을 볼 수없는 이유는 무엇입니까?


4
이 작업이 쉽게 수행되지 않는다는 것이 우스꽝스럽지 않습니까? 코드를 작성하지 않고도이를 수행 할 수있는 더 간단한 방법이 있어야합니다.
Maccurt

3
참고 : 외부 URL에 http : // 또는 https : //가 포함되어 있지 않으면 Angular 4는 URL을 내부 경로로 취급합니다. 다른 사람이 어려움을 겪고있는 경우.
aherocalledFrog

답변:


214

이것을 사용할 수 있습니다-> window.location.href = '...';

그러면 페이지가 원하는대로 변경됩니다.


3
어쨌든 값을 변경하는 대신 어떤 이유로 함수로 호출하려고했습니다. 값을 직접 설정하면 작동합니다.
Michael Oryl

9
창을 직접 참조하면 코드가 창 개체가있는 플랫폼으로 제한됩니다.
청산

2
@ender는 대안이 없습니까? 실제로 외부 링크로 리디렉션하려는 시나리오가있을 수 있습니다. 물론 우리는 window.location.href를 사용할 수 있지만 말했듯이 단점이 있습니다. Angular에 지원되는 API가 있다면 더 도움이 될 것입니다.
Krishnan

1
물론, 자바 스크립트를 실행하고 페이지 리디렉션을 수행해야하는 모든 플랫폼의 99 %입니다. 팬텀 / 캐스퍼조차도 윈도우 객체를 존중합니다. 전화를 걸 document.location.href거나 Location.href모두 동일한 객체를 참조 할 수도 있습니다. 위치 참조
Dennis Smolek

2
@DennisSmolek 그러나 Universal을 사용하여 이것을 안드로이드 앱으로 컴파일하려고하면이 동작이 실패하지 않습니까?
엔더

124

앞에서 설명한 방법에 대한 Angular 접근법 DOCUMENT@angular/common(또는 @angular/platform-browserAngular <4)에서 가져 와서 사용하는 것입니다

document.location.href = 'https://stackoverflow.com';

함수 내부.

some-page.component.ts

import { DOCUMENT } from '@angular/common';
...
constructor(@Inject(DOCUMENT) private document: Document) { }

goToUrl(): void {
    this.document.location.href = 'https://stackoverflow.com';
}

some-page.component.html

<button type="button" (click)="goToUrl()">Click me!</button>

자세한 정보 는 plateformBrowser 저장소를 확인하십시오 .


여기에서 요구 사항은 로그인 목적으로 리디렉션해야하므로 SSO 앱이 성공한 후 앱으로 다시 리디렉션되어야하므로 대상 사이트에서 요청이 앱에서 온 것임을 알 수 있습니다.
NitinSingh

5
각도 4에서 DOCUMENT는 @angular/common(즉 import { DOCUMENT } from '@angular/common';) 에서 가져와야 하지만 그렇지 않으면 훌륭합니다! github.com/angular/angular/blob/master/packages/…
John

4
이런 식으로 문서를 주입하는 목적은 무엇입니까@Inject(DOCUMENT) private document: any
Sunil Garg

1
@SunilGarg Injecting을 DOCUMENT사용하면 문서 개체를 모의 단위 테스트로 쉽게 바꿀 수 있습니다. 또한 다른 플랫폼 (서버 / 모바일)에서 대체 구현을 사용할 수 있습니다.
eppsilon

3
엄격한 타이핑을 위해,constructor(@Inject(DOCUMENT) private document: Document) { }
Ian Jamieson

38

Dennis Smolek이 말했듯 이 솔루션 은 매우 간단합니다. window.location.href전환하려는 URL로 설정 하면 작동합니다.

예를 들어, 컴포넌트의 클래스 파일 (컨트롤러)에이 메소드가있는 경우 :

goCNN() {
    window.location.href='http://www.cnn.com/';
}

그런 다음 (click)템플릿의 버튼 (또는 무엇이든)에 대한 적절한 호출로 간단히 호출 할 수 있습니다.

<button (click)="goCNN()">Go to CNN</button>

21

나는 당신이 à target = "_ blank"필요하다고 생각 하므로 다음을 사용할 수 있습니다 window.open.

gotoGoogle() : void {
     window.open("https://www.google.com", "_blank");
}

10

OnDestry 수명주기 후크를 사용하고 있다면 window.location.href = ...를 호출하기 전에 이와 같은 것을 사용하는 것이 좋습니다.

    this.router.ngOnDestroy();
    window.location.href = 'http://www.cnn.com/';

구성 요소에서 OnDestry 콜백을 트리거합니다.

아, 그리고 :

import { Router } from '@angular/router';

라우터를 찾을 수있는 곳입니다.

--- 편집 --- 슬프게도, 위의 예에서 틀렸을 수도 있습니다. 적어도 현재 프로덕션 코드에서 실행 된대로 작동하지 않습니다. 따라서 더 조사 할 시간이 될 때까지 다음과 같이 해결합니다 (가능한 경우 앱이 실제로 후크가 필요하기 때문에)

this.router.navigate(["/"]).then(result=>{window.location.href = 'http://www.cnn.com/';});

기본적으로 임의의 (더미) 경로로 라우팅하여 후크를 강제 한 다음 요청에 따라 탐색합니다.



3

내 머리를 찢은 후에 해결책은 http : //를 href에 추가하는 것입니다.

<a href="http://www.URL.com">Go somewhere</a>

4
그것에 대해 어떤 질문에 대답하십니까?
귀도 Flohr

2

window.location.href = ' http : // external-url ';을 사용했습니다.

나에게 리디렉션은 Chrome에서 작동했지만 Firefox에서는 작동하지 않았습니다. 다음 코드는 내 문제를 해결했습니다.

window.location.assign('http://external-url');

1

전역 창 개체를 직접 조작하고 싶지 않기 때문에 Angular 2 Location을 사용하여 수행했습니다.

https://angular.io/docs/ts/latest/api/common/index/Location-class.html#!#prepareExternalUrl-anchor

다음과 같이 할 수 있습니다 :

import {Component} from '@angular/core';
import {Location} from '@angular/common';
@Component({selector: 'app-component'})
class AppCmp {
  constructor(location: Location) {
    location.go('/foo');
  }
}

1
나에게 이것은 URL을 변경하고 앱 상태는 변경되지 않습니다 (실제 경로는 동일하게 보입니다). 'location.replaceState ('/ ')조차도 예상대로 작동하지 않았습니다. router.navigate(['/']);나를 위해 무엇을 했습니까?
매트 Rowles

2
각도 2 위치는 해당되는 소리로 들리지 않습니다. 문서에 따르면 위치의 목적은 다음과 같습니다. "위치는 응용 프로그램의 기본 href에 대해 URL을 정규화해야합니다." 이것을 사용하여 응용 프로그램 내의 URL로 리디렉션하는 것이 적절할 수 있습니다. 외부 URL로 리디렉션하는 데 사용하는 것이 문서와 맞지 않는 것 같습니다.
J. 프리츠 반즈

1

위의 솔루션 중 어느 것도 나를 위해 일한 적이 없으며 방금 추가했습니다.

window.location.href = "www.google.com"
event.preventDefault();

이것은 나를 위해 일했습니다.

또는 사용해보십시오

window.location.replace("www.google.com");

0

당신에 component.ts

import { Component } from '@angular/core';

@Component({
  ...
})
export class AppComponent {
  ...
  goToSpecificUrl(url): void {
    window.location.href=url;
  }

  gotoGoogle() : void {
    window.location.href='https://www.google.com';
  }
}

당신에 component.html

<button type="button" (click)="goToSpecificUrl('http://stackoverflow.com/')">Open URL</button>
<button type="button" (click)="gotoGoogle()">Open Google</button>

<li *ngFor="item of itemList" (click)="goToSpecificUrl(item.link)"> // (click) don't enable pointer when we hover so we should enable it by using css like: **cursor: pointer;**
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.