Angular2'de harici bir URL'ye nasıl yeniden yönlendirilir?


175

Açısal 2'de kullanıcıyı tamamen harici bir URL'ye yönlendirmenin yöntemi nedir? Örneğin, kimlik doğrulaması için kullanıcıyı bir OAuth2 sunucusuna yönlendirmem gerekirse, bunu nasıl yapabilirim?

Location.go(),, Router.navigate()ve Router.navigateByUrl()kullanıcıyı Açısal 2 uygulaması içindeki başka bir bölüme (rotaya) göndermek için iyidir, ancak harici bir siteye yönlendirmek için nasıl kullanılabileceğini göremiyorum?


4
Bunun kolayca yapılmamasını saçma bulmuyor musunuz? Bunu kodlamak zorunda kalmadan bunu yapmanın daha basit bir yolu olmalı.
Maccurt

4
Not: Harici URL'niz http: // veya https: // içermiyorsa, Açısal 4 URL'yi dahili bir rota olarak ele alır. Başka birinin bununla mücadele etmesi durumunda.
aherocalledFrog

Yanıtlar:


216

Bunu kullanabilirsiniz-> window.location.href = '...';

Bu, sayfayı istediğiniz gibi değiştirir.


3
Ugh, sadece değeri değiştirmek yerine bir sebepten dolayı fonksiyon olarak çağırmayı denedim. Değerin ayarlanması doğrudan çalışır.
Michael Oryl

9
Doğrudan pencereye başvurmanın, kodunuzu bir pencere nesnesine sahip platformlarla sınırlayacağını unutmayın.
bitiş

2
@ender buna bir alternatif yok mu? Dış bağlantılara gerçekten yönlendirmek istediğimiz senaryolar olabilir. Elbette, window.location.href dosyasını kullanabiliriz, ancak dediğin gibi, dezavantajları vardır. Angular'da desteklenen bir API varsa, bu daha iyi yardımcı olacaktır.
Krishnan

1
Elbette, javascript çalıştıran ve bir sayfa yönlendirmesi yapması gereken tüm platformların% 99'u budur. Fantom / casperJ'ler bile pencere nesnesine saygı duyar. Hepsi aynı nesneye atıfta document.location.hrefbulunsa bile arayabilirsiniz Location.href. Konum Referansı
Dennis Smolek

2
@DennisSmolek Ama bunu Universal kullanarak bir android uygulamasında derlemeye çalışırsanız, bu davranış başarısız olmaz mı?
bitiş

124

Daha önce açıklanan yöntemlere açısal yaklaşım DOCUMENT, @angular/common(veya @angular/platform-browserAçısal <4'ten) içe aktarmak ve kullanmaktır.

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

bir işlev içinde.

Bazı-page.component.ts

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

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

Bazı-page.component.html

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

Check out plateformBrowser fazla bilgi için repo.


Buradaki gereksinim giriş amacına yönlendirmek olduğu için hedef sitenin isteğin geldiğini
bilecek midir

5
Açısal 4'te, DOCUMENT @angular/common(yani import { DOCUMENT } from '@angular/common';) ' dan içe aktarılmalıdır , ancak aksi takdirde bu harika çalışır! Bkz. Github.com/angular/angular/blob/master/packages/…
John

4
belgeyi bu şekilde enjekte etmenin amacı nedir@Inject(DOCUMENT) private document: any
Sunil Garg

1
@SunilGarg Enjekte etme DOCUMENT, birim testlerinde belge nesnesini bir sahte ile değiştirmeyi kolaylaştırır. Ayrıca diğer platformlarda (sunucu / mobil) alternatif bir uygulamanın kullanılmasına izin verir.
eppsilon

3
Sıkı yazmak için kullanıyorum,constructor(@Inject(DOCUMENT) private document: Document) { }
Ian Jamieson

38

Dennis Smolek'in dediği gibi çözüm çok basit. Geçmek window.location.hrefistediğiniz URL'ye ayarlayın ve bu sadece çalışır.

Örneğin, bileşeninizin sınıf dosyasında (denetleyici) bu yöntem varsa:

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

Ardından (click), şablonunuzdaki bir düğme (veya herhangi bir şey) üzerindeki uygun çağrı ile oldukça basit bir şekilde arayabilirsiniz:

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

21

Bence à target = "_ blank" gerekir , böylece kullanabilirsiniz window.open:

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

10

OnDestry yaşam döngüsü kancasını kullanıyorsanız, window.location.href = ... öğesini çağırmadan önce böyle bir şey kullanmak isteyebilirsiniz.

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

bileşeninizde beğenebileceğiniz OnDestry geri aramasını tetikler.

Ohh ve ayrıca:

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

yönlendiriciyi bulduğunuz yerdir.

--- EDIT --- Ne yazık ki, yukarıdaki örnekte yanılmış olabilirim. En azından şu anda üretim kodumda beklendiği gibi çalışmıyor - bu yüzden, daha fazla araştırmak için zamanım olana kadar, bunu çözdüm (uygulamam mümkün olduğunda kancaya gerçekten ihtiyaç duyduğundan)

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

Temelde kancayı zorlamak için herhangi bir (kukla) rotaya yönlendirme ve ardından istendiği gibi gezinin.


6

pencereli Angular'ın yeni sürümlerinde any

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

en iyi cevap
Victor Bredihin

Angular'daki yeni sürümler yalnızca düz pencereye izin vermiyor mu?
Justin

3

Kafamı söktükten sonra, çözüm href'e http: // eklemektir.

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

4
Bununla hangi soruyu cevaplıyorsun?
Guido Flohr

2

Window.location.href = ' http: // external-url ' kullandım;

Benim için yönlendirmeler Chrome'da çalıştı, ancak Firefox'ta çalışmadı. Aşağıdaki kod sorunumu çözdü:

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

1

Genel pencere nesnesini kendim manipüle etmek istemediğim için Açısal 2 Konumu kullanarak yaptım.

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

Bu şekilde yapılabilir:

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

1
Benim için bu sadece URL'yi değiştiriyor ve uygulama durumu değişmiyor (gerçek rota aynı görünüyor). 'Location.replaceState (' / ') bile beklediğim gibi davranmadı. router.navigate(['/']);bunu benim için yaptı.
Matt Rowles

2
Açısal 2 Konum geçerli görünmüyor. Dokümanlar konumun amacının şu olduğunu belirtir: "Konum, uygulamanın temel href'ine göre URL'nin normalleştirilmesinden sorumludur." Bunu uygulama içindeki bir URL'ye yönlendirmek için kullanmak uygun olabilir; harici bir URL'ye yönlendirmek için kullanmak dokümanlara uymuyor gibi görünüyor.
J. Fritz Barnes

1

Yukarıdaki çözümlerin hiçbiri benim için çalışmadı, yeni ekledim

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

Bu benim için çalıştı.

Veya kullanmayı deneyin

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

0

Senin içinde 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';
  }
}

Senin içinde 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;**
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.