Bagaimana cara mengarahkan ulang ke URL eksternal di Angular2?

175

Apa metode untuk mengarahkan pengguna ke URL yang sepenuhnya eksternal di Angular 2. Sebagai contoh, jika saya perlu mengarahkan pengguna ke server OAuth2 untuk mengotentikasi, bagaimana saya melakukannya?

Location.go(),, Router.navigate()dan Router.navigateByUrl()apakah boleh mengirim pengguna ke bagian lain (rute) dalam aplikasi Angular 2, tetapi saya tidak dapat melihat bagaimana mereka dapat digunakan untuk mengarahkan ulang ke situs eksternal?

Michael Oryl
sumber
4
Tidakkah Anda merasa konyol bahwa ini tidak mudah dilakukan? Harus ada cara yang lebih sederhana untuk melakukan ini, tanpa harus kode untuk itu.
Maccurt
4
Catatan: Jika URL eksternal Anda tidak mengandung http: // atau https: //, Angular 4 akan memperlakukan URL sebagai rute internal. Kalau-kalau ada orang lain yang berjuang dengan itu.
aherocalledFrog

Jawaban:

216

Anda bisa menggunakan ini-> window.location.href = '...';

Ini akan mengubah halaman menjadi apa pun yang Anda inginkan ..

Dennis Smolek
sumber
3
Ugh, saya mencoba memanggilnya sebagai fungsi untuk beberapa alasan daripada hanya mengubah nilainya. Pengaturan nilai langsung bekerja.
Michael Oryl
9
Ingatlah bahwa merujuk langsung ke jendela akan membatasi kode Anda ke platform dengan objek jendela.
ender
2
@ender tidak ada alternatif untuk itu? Mungkin ada skenario di mana kita benar-benar ingin mengarahkan ulang ke tautan eksternal. Tentu, kita dapat menggunakan window.location.href, tetapi seperti yang Anda katakan, itu memiliki kekurangan. Jika ada API yang didukung di Angular, itu akan membantu lebih baik.
Krishnan
1
Tentu, tetapi itu adalah 99% dari semua platform yang menjalankan javascript dan perlu melakukan redirect halaman. Bahkan phantom / casperJs menghormati objek window. Anda dapat memanggil document.location.hrefatau bahkan Location.hrefkarena mereka semua merujuk ke objek yang sama. Referensi Lokasi
Dennis Smolek
2
@DennisSmolek Tetapi jika Anda mencoba mengkompilasi ini menjadi aplikasi android menggunakan Universal, bukankah perilaku ini akan gagal?
ender
124

Pendekatan Angular ke metode yang dijelaskan sebelumnya adalah mengimpor DOCUMENTdari @angular/common(atau @angular/platform-browserdalam Angular <4) dan digunakan

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

di dalam suatu fungsi.

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>

Lihat repo plateformBrowser untuk info lebih lanjut.

Brian
sumber
Apakah situs target tahu bahwa permintaan datang dari aplikasi kami, karena persyaratan di sini adalah untuk mengarahkan ulang untuk tujuan login dan karenanya aplikasi SSO harus mengarahkan kembali ke aplikasi kami setelah sukses
NitinSingh
5
Di sudut 4, DOCUMENT harus diimpor dari @angular/common(yaitu import { DOCUMENT } from '@angular/common';), tetapi jika tidak, ini akan berhasil! Lihat github.com/angular/angular/blob/master/packages/…
John
4
apa tujuan dari menyuntikkan dokumen dengan cara ini@Inject(DOCUMENT) private document: any
Sunil Garg
1
@SunilGarg Injecting DOCUMENTmemudahkan mengganti objek dokumen dengan tes unit tiruan. Ini juga memungkinkan implementasi alternatif untuk digunakan pada platform lain (server / seluler).
eppsilon
3
Untuk pengetikan yang ketat saya gunakan,constructor(@Inject(DOCUMENT) private document: Document) { }
Ian Jamieson
38

Solusinya , seperti yang dikatakan Dennis Smolek, sangat sederhana. Setel window.location.hrefke URL yang ingin Anda alihkan dan hanya berfungsi.

Misalnya, jika Anda memiliki metode ini di file kelas komponen Anda (pengontrol):

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

Maka Anda bisa menyebutnya cukup sederhana dengan (click)panggilan yang sesuai pada tombol (atau apa pun) di template Anda:

<button (click)="goCNN()">Go to CNN</button>
Michael Oryl
sumber
21

Saya pikir Anda perlu à target = "_ blank" , jadi Anda dapat menggunakan window.open:

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

Jika Anda telah menggunakan kait siklus hidup OnDestry, Anda mungkin tertarik untuk menggunakan sesuatu seperti ini sebelum memanggil window.location.href = ...

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

yang akan memicu panggilan balik OnDestry di komponen Anda yang mungkin Anda sukai.

Ohh, dan juga:

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

Di sinilah Anda menemukan router.

--- EDIT --- Sayangnya, saya mungkin salah dalam contoh di atas. Setidaknya itu tidak berfungsi seperti yang diharapkan dalam kode produksi saya sekarang - jadi, sampai saya punya waktu untuk menyelidiki lebih lanjut, saya menyelesaikannya seperti ini (karena aplikasi saya benar-benar membutuhkan pengait jika memungkinkan)

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

Pada dasarnya merutekan ke rute (dummy) apa pun untuk memaksa pengait, lalu menavigasi sesuai permintaan.

Henry Arousell
sumber
6

di versi Angular dengan jendela yang lebih baru sebagai any

(window as any).open(someUrl, "_blank");
pengguna738048
sumber
jawaban terbaik
Victor Bredihin
Apakah versi yang lebih baru pada Angular tidak mengizinkan jendela biasa?
Justin
3

Setelah merobek kepalaku, solusinya adalah menambahkan http: // ke href.

<a href="http://www.URL.com">Go somewhere</a>
Joel
sumber
4
Pertanyaan apa yang Anda jawab dengan itu?
Guido Flohr
2

Saya menggunakan window.location.href = ' http: // external-url ';

Bagi saya pengalihan bekerja di Chrome, tetapi tidak berfungsi di Firefox. Kode berikut menyelesaikan masalah saya:

window.location.assign('http://external-url');
Laura Chesches
sumber
1

Saya melakukannya menggunakan Lokasi 2 Angular karena saya tidak ingin memanipulasi objek jendela global sendiri.

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

Itu bisa dilakukan seperti ini:

import {Component} from '@angular/core';
import {Location} from '@angular/common';
@Component({selector: 'app-component'})
class AppCmp {
  constructor(location: Location) {
    location.go('/foo');
  }
}
pengguna3220080
sumber
1
Bagi saya, ini hanya mengubah URL dan status aplikasi tidak berubah (rute sebenarnya terlihat sama). Bahkan 'location.replaceState (' / ') tidak bertindak seperti yang saya harapkan. router.navigate(['/']);adalah apa yang dilakukan untukku.
Matt Rowles
2
Lokasi Angular 2 tidak terdengar berlaku. Dokumen menyatakan bahwa tujuan lokasi adalah: "Lokasi bertanggung jawab untuk menormalkan URL terhadap href basis aplikasi." Menggunakan ini untuk mengarahkan ulang ke URL di dalam aplikasi mungkin sesuai; menggunakannya untuk mengarahkan ulang ke URL eksternal sepertinya tidak cocok dengan dokumen.
J. Fritz Barnes
1

Tidak ada solusi di atas yang berfungsi untuk saya, saya hanya menambahkan

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

Ini berhasil untuk saya.

Atau coba gunakan

window.location.replace("www.google.com");
Rishi0405
sumber
0

Di component.ts Anda

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

Di component.html Anda

<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;**
Phan Van Linh
sumber