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?


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 ..


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.


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>

21

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

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

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.


6

di versi Angular dengan jendela yang lebih baru sebagai any

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

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>

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

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

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");

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;**
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.