Làm cách nào để chuyển hướng đến một URL bên ngoài trong Angular2?


173

Phương pháp để chuyển hướng người dùng đến một URL hoàn toàn bên ngoài trong Angular 2. Ví dụ: nếu tôi cần chuyển hướng người dùng đến máy chủ OAuth2 để xác thực, tôi sẽ làm thế nào?

Location.go(), Router.navigate()Router.navigateByUrl()ổn khi gửi người dùng đến một phần (tuyến đường) khác trong ứng dụng Angular 2, nhưng tôi không thể thấy cách họ có thể được sử dụng để chuyển hướng đến một trang web bên ngoài?


4
Bạn có thấy nực cười là điều này không dễ thực hiện không? Phải có một cách đơn giản hơn để làm điều này, mà không cần phải mã cho nó.
Maccurt

3
Lưu ý: Nếu URL bên ngoài của bạn không chứa http: // hoặc https: //, Angular 4 sẽ coi URL là một tuyến nội bộ. Trong trường hợp bất cứ ai khác đang vật lộn với điều đó.
aherocalledFrog

Câu trả lời:


214

Bạn có thể sử dụng cái này-> window.location.href = '...';

Điều này sẽ thay đổi trang thành bất cứ điều gì bạn muốn ..


3
Ugh, tôi đã cố gắng gọi nó là một chức năng vì một số lý do thay vì chỉ thay đổi giá trị. Đặt giá trị trực tiếp hoạt động.
Michael Oryl

9
Chỉ cần nhớ rằng tham chiếu trực tiếp cửa sổ sẽ giới hạn mã của bạn vào các nền tảng với một đối tượng cửa sổ.
Ender

2
@ender không có sự thay thế cho nó? Có thể có những kịch bản mà chúng tôi thực sự muốn chuyển hướng đến các liên kết bên ngoài. Chắc chắn, chúng ta có thể sử dụng window.location.href, nhưng như bạn nói, nó có nhược điểm của nó. Nếu có API được hỗ trợ trong Angular, điều đó sẽ giúp tốt hơn.
Krish Nam

1
Chắc chắn, nhưng đó là 99% của tất cả các nền tảng chạy javascript và cần thực hiện chuyển hướng trang. Ngay cả ph Phantom / casperJs cũng tôn trọng đối tượng cửa sổ. Bạn có thể gọi document.location.hrefhoặc thậm chí Location.hrefvì tất cả chúng đều đề cập đến cùng một đối tượng. Tham chiếu vị trí
Dennis Smolek

2
@DennisSmolek Nhưng nếu bạn cố gắng biên dịch ứng dụng này thành ứng dụng Android bằng Universal, hành vi này có thất bại không?
Ender

124

Cách tiếp cận Angular đối với các phương thức được mô tả trước đây là nhập DOCUMENTtừ @angular/common(hoặc @angular/platform-browsertrong Angular <4) và sử dụng

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

bên trong một chức năng.

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>

Kiểm tra repo mảngformBrowser để biết thêm thông tin.


Trang web mục tiêu có biết rằng yêu cầu đến từ ứng dụng của chúng tôi không, vì yêu cầu ở đây là chuyển hướng cho mục đích đăng nhập và do đó, ứng dụng SSO sẽ chuyển hướng trở lại ứng dụng của chúng tôi sau khi thành công
NitinSingh

5
Trong góc 4, DOCUMENT nên được nhập từ @angular/common(nghĩa là import { DOCUMENT } from '@angular/common';), nhưng nếu không thì điều này hoạt động rất tốt! Xem github.com/angular/angular/blob/master/packages/ từ
John

4
Mục đích của việc tiêm tài liệu theo cách này là gì@Inject(DOCUMENT) private document: any
Sunil Garg

1
@SunilGarg Tiêm DOCUMENTgiúp dễ dàng thay thế đối tượng tài liệu bằng giả trong các thử nghiệm đơn vị. Nó cũng cho phép thực hiện thay thế được sử dụng trên các nền tảng khác (máy chủ / thiết bị di động).
eppsilon

3
Đối với kiểu gõ nghiêm ngặt tôi sử dụng,constructor(@Inject(DOCUMENT) private document: Document) { }
Ian Jamieson

38

Giải pháp , như Dennis Smolek nói, đã chết đơn giản. Đặt window.location.hrefthành URL bạn muốn chuyển sang và nó chỉ hoạt động.

Ví dụ: nếu bạn có phương thức này trong tệp lớp (bộ điều khiển) của thành phần:

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

Sau đó, bạn có thể gọi nó khá đơn giản với (click)cuộc gọi thích hợp trên một nút (hoặc bất cứ điều gì) trong mẫu của bạn:

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

21

Tôi nghĩ bạn cần à target = "_ blank" , vì vậy sau đó bạn có thể sử dụng window.open:

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

10

Nếu bạn đã sử dụng hook vòng đời OnDestry, bạn có thể quan tâm đến việc sử dụng cái gì đó như thế này trước khi gọi window.location.href = ...

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

điều đó sẽ kích hoạt cuộc gọi lại OnDestry trong thành phần của bạn mà bạn có thể thích.

Ồ, và cũng:

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

là nơi bạn tìm thấy bộ định tuyến.

--- EDIT --- Đáng buồn thay, tôi có thể đã sai trong ví dụ trên. Ít nhất là nó không hoạt động như ngoại lệ trong mã sản xuất của tôi ngay bây giờ - vì vậy, cho đến khi tôi có thời gian để điều tra thêm, tôi giải quyết nó như thế này (vì ứng dụng của tôi thực sự cần hook khi có thể)

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

Về cơ bản định tuyến đến bất kỳ tuyến (giả) nào để buộc móc, và sau đó điều hướng theo yêu cầu.


6

trong các phiên bản mới hơn của Angular với cửa sổ là một any

(window as any).open(someUrl, "_blank");

câu trả lời hay nhất
Victor Bredihin

Các phiên bản mới hơn trên Angular không cho phép chỉ là cửa sổ đơn giản?
Justin

3

Sau khi tách đầu tôi ra, giải pháp chỉ là thêm http: // to href.

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

4
Câu hỏi nào bạn trả lời với điều đó?
Guido Flohr

2

Tôi đã sử dụng window.location.href = ' http: // bên ngoài-url ';

Đối với tôi, các chuyển hướng hoạt động trong Chrome, nhưng không hoạt động trong Firefox. Đoạn mã sau đã giải quyết vấn đề của tôi:

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

1

Tôi đã làm điều đó bằng cách sử dụng Vị trí góc 2 vì tôi không muốn tự mình thao tác với đối tượng cửa sổ toàn cầu.

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

Nó có thể được thực hiện như thế này:

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

1
Đối với tôi, điều này chỉ thay đổi URL và trạng thái ứng dụng không thay đổi (tuyến thực tế trông giống nhau). Ngay cả 'location.replaceState (' / ') cũng không hoạt động như tôi mong đợi. router.navigate(['/']);là những gì đã làm cho tôi.
Matt Rowles

2
Angular 2 Location không áp dụng âm thanh. Các tài liệu nói rằng mục đích của vị trí là: "Vị trí chịu trách nhiệm bình thường hóa URL dựa trên cơ sở của ứng dụng." Sử dụng điều này để chuyển hướng đến một URL trong ứng dụng có thể phù hợp; sử dụng nó để chuyển hướng đến một URL bên ngoài dường như không phù hợp với tài liệu.
J. Fritz Barnes

1

Không có giải pháp nào ở trên làm việc cho tôi, tôi chỉ cần thêm

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

Điều này làm việc cho tôi.

Hoặc thử sử dụng

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

0

Trong thành phần của bạn.

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';
  }
}

Trong thành phần của bạn.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;**
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.