จะเปลี่ยนเส้นทางไปยัง URL ภายนอกใน Angular2 ได้อย่างไร


173

วิธีการเปลี่ยนเส้นทางผู้ใช้ไปยัง URL ภายนอกทั้งหมดใน Angular 2 ตัวอย่างเช่นหากฉันต้องการเปลี่ยนเส้นทางผู้ใช้ไปยังเซิร์ฟเวอร์ OAuth2 เพื่อตรวจสอบสิทธิ์ฉันจะทำอย่างไร

Location.go(), Router.navigate()และRouter.navigateByUrl()ไม่เป็นไรสำหรับการส่งผู้ใช้ไปยังส่วนอื่น (เส้นทาง) ภายในแอป Angular 2 แต่ฉันไม่เห็นว่าพวกเขาจะถูกนำไปใช้เพื่อเปลี่ยนเส้นทางไปยังไซต์ภายนอกได้อย่างไร


4
คุณไม่พบว่ามันไร้สาระที่จะไม่ทำอย่างง่ายดาย? จะต้องมีวิธีที่ง่ายกว่านี้โดยไม่ต้องใช้รหัส
Maccurt

3
หมายเหตุ: หาก URL ภายนอกของคุณไม่มี http: // หรือ https: //, Angular 4 จะถือว่า URL เป็นเส้นทางภายใน ในกรณีที่คนอื่นกำลังดิ้นรนกับสิ่งนั้น
aherocalledFrog

คำตอบ:


214

คุณสามารถใช้สิ่งนี้ -> window.location.href = '...';

สิ่งนี้จะเปลี่ยนหน้าเป็นสิ่งที่คุณต้องการ ..


3
ฮึฉันพยายามเรียกมันว่าเป็นฟังก์ชั่นด้วยเหตุผลบางอย่างแทนที่จะแค่เปลี่ยนค่า การตั้งค่าใช้งานได้โดยตรง
Michael Oryl

9
เพียงจำไว้ว่าการอ้างอิงหน้าต่างโดยตรงจะ จำกัด รหัสของคุณไว้เฉพาะแพลตฟอร์มที่มีวัตถุหน้าต่าง
สิ้นสุด

2
@ender ไม่มีทางเลือกอื่นอีกหรือ? อาจมีสถานการณ์ที่เราต้องการเปลี่ยนเส้นทางไปยังลิงก์ภายนอกอย่างแท้จริง แน่นอนว่าเราสามารถใช้ window.location.href แต่อย่างที่คุณพูดมันมีข้อเสีย หากมี API ที่รองรับใน Angular นั่นจะช่วยได้ดีกว่า
Krishnan

1
แน่นอน แต่นั่นคือ 99% ของแพลตฟอร์มทั้งหมดที่ใช้งานจาวาสคริปต์และต้องทำการเปลี่ยนเส้นทางหน้าเว็บ แม้แต่ phantom / casperJs ก็เคารพวัตถุหน้าต่างด้วย คุณสามารถโทรdocument.location.hrefหรือแม้กระทั่งLocation.hrefขณะที่พวกเขาทั้งหมดอ้างถึงวัตถุเดียวกัน การอ้างอิงตำแหน่ง
Dennis Smolek

2
@DennisSmolek แต่ถ้าคุณลองคอมไพล์นี่ให้เป็นแอพ android ที่ใช้ Universal แล้วพฤติกรรมนี้จะไม่ล้มเหลวเหรอ?
สิ้นสุด

124

วิธีเชิงมุมของวิธีที่อธิบายไว้ก่อนหน้านี้คือการนำเข้าDOCUMENTจาก@angular/common(หรือ@angular/platform-browserในเชิงมุม <4) และใช้งาน

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

ภายในฟังก์ชั่น

บาง page.component.ts

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

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

บาง page.component.html

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

ตรวจสอบrepo plateformBrowserสำหรับข้อมูลเพิ่มเติม


ไซต์เป้าหมายจะทราบหรือไม่ว่าคำขอมาจากแอปของเราเนื่องจากข้อกำหนดที่นี่คือการเปลี่ยนเส้นทางเพื่อการเข้าสู่ระบบและด้วยเหตุนี้แอป SSO ควรเปลี่ยนเส้นทางกลับไปที่แอปของเราหลังจากประสบความสำเร็จ
NitinSingh

5
ในเชิงมุม 4 เอกสารควรนำเข้าจาก@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 การฉีดDOCUMENTทำให้ง่ายต่อการแทนที่วัตถุเอกสารด้วยการจำลองในการทดสอบหน่วย นอกจากนี้ยังอนุญาตให้มีการใช้งานทางเลือกที่จะใช้ในแพลตฟอร์มอื่น ๆ (เซิร์ฟเวอร์ / มือถือ)
eppsilon

3
สำหรับการพิมพ์ที่เข้มงวดฉันใช้constructor(@Inject(DOCUMENT) private document: Document) { }
Ian Jamieson

38

วิธีการแก้ปัญหาดังที่เดนนิสสโมเลคกล่าวว่าทำได้ง่าย ตั้งค่า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/';});

โดยทั่วไปการกำหนดเส้นทางไปยังเส้นทาง (จำลอง) ใด ๆ เพื่อบังคับใช้ hook จากนั้นนำทางตามที่ร้องขอ


6

ใน Angular รุ่นใหม่กว่าที่มีหน้าต่างเป็น any

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

คำตอบที่ดีที่สุด
Victor Bredihin

รุ่นที่ใหม่กว่าใน Angular ไม่อนุญาตให้มีเพียงหน้าต่างธรรมดาหรือไม่
Justin

3

หลังจากฉีกหัวฉันออกไปทางออกก็แค่เพิ่ม http: // ไปยัง href

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

4
คุณตอบคำถามอะไร
Guido 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(['/']);มันคือสิ่งที่ทำเพื่อฉัน
Matt Rowles

2
ตำแหน่ง Angular 2 ไม่สามารถใช้งานได้ เอกสารระบุว่าจุดประสงค์ของที่ตั้งคือ: "ที่ตั้งมีหน้าที่รับผิดชอบในการทำให้ URL เป็นมาตรฐานกับ href ฐานของแอปพลิเคชัน" การใช้สิ่งนี้เพื่อเปลี่ยนเส้นทางไปยัง URL ภายในแอปพลิเคชันอาจเหมาะสม การใช้เพื่อเปลี่ยนเส้นทางไปยัง URL ภายนอกดูเหมือนจะไม่เหมาะกับเอกสาร
J. Fritz Barnes

1

ไม่มีวิธีแก้ปัญหาใดที่ใช้ได้สำหรับฉันฉันเพิ่งเพิ่ม

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

สิ่งนี้ใช้ได้สำหรับฉัน

หรือลองใช้

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

0

ในส่วนประกอบของคุณ

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.