Angular2で外部URLにリダイレクトする方法は?


175

Angular 2で完全に外部のURLにユーザーをリダイレクトする方法は何ですか。たとえば、認証のためにユーザーをOAuth2サーバーにリダイレクトする必要がある場合、どうすればよいですか?

Location.go()Router.navigate()、およびRouter.navigateByUrl()角度2アプリ内の他のセクション(ルート)にユーザーを送信するための罰金ですが、私は彼らが外部のサイトにリダイレクトするために使用する方法を見ることができませんか?


4
これが簡単にできないのはばかげていると思いませんか?それをコード化する必要なしに、これを行う簡単な方法がなければなりません。
Maccurt

4
注:外部URLにhttp://またはhttps://が含まれていない場合、Angular 4はURLを内部ルートとして扱います。他の誰かがそれに苦労している場合に備えて。
aherocalledFrog

回答:


216

あなたはこれを使うことができます-> window.location.href = '...';

これにより、ページが必要なものに変更されます。


3
値を変更するだけでなく、何らかの理由で関数として呼び出してみました。値の設定は直接機能します。
Michael Oryl

9
ウィンドウを直接参照すると、コードがウィンドウオブジェクトを持つプラットフォームに制限されることに注意してください。
2016年

2
@enderはそれに代わるものはありませんか?本当に外部リンクにリダイレクトしたいシナリオがあるかもしれません。もちろん、window.location.hrefを使用できますが、あなたが言うように、欠点があります。AngularでサポートされているAPIがあれば、それはより良い助けになるでしょう。
クリシュナン2017年

1
もちろん、それはJavaScriptを実行し、ページのリダイレクトを行う必要があるすべてのプラットフォームの99%です。phantom / casperJsもwindowオブジェクトを尊重します。document.location.hrefまたはLocation.href同じオブジェクトを参照している場合でも、呼び出すことができます。場所の参照
デニススモレク2017年

2
@DennisSmolekしかし、これをUniversalを使用してAndroidアプリにコンパイルしようとすると、この動作は失敗しませんか?
エンダー2017年

124

前述の方法に対するAngularのアプローチは、(Angular <4から)インポートDOCUMENTして使用することです@angular/common@angular/platform-browser

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

関数内。

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>

詳細については、plateformBrowserリポジトリを確認してください。


う、ここでの要件は、ログイン目的のためにリダイレクトするために、したがって、SSOアプリが成功した後、我々のアプリに戻ってリダイレクトする必要があるため、要求は、我々のアプリから来ていることを標的部位のノウハウ
NitinSingh

5
angular 4では、DOCUMENTをからインポートする必要があります@angular/common(つまりimport { DOCUMENT } from '@angular/common';)が、それ以外の場合はこれでうまくいきます!github.com/angular/angular/blob/master/packages/…を
John

4
この方法でドキュメントを@Inject(DOCUMENT) private document: any
挿入

1
@SunilGargインジェクションを使用DOCUMENTすると、単体テストでドキュメントオブジェクトをモックに簡単に置き換えることができます。また、他のプラットフォーム(サーバー/モバイル)で代替の実装を使用することもできます。
Eppsilon 2018年

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

基本的に、任意の(ダミー)ルートにルーティングしてフックを強制し、要求に応じてナビゲートします。



3

頭をすり落とした後の解決策は、http://をhrefに追加することです。

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

4
それでどんな質問に答えますか?
グイドフロー

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、2016年

2
Angular 2の場所は適切に聞こえません。ドキュメントには、場所の目的は次のとおりであると記載されています。「場所は、アプリケーションのベースhrefに対してURLを正規化する責任があります。」これを使用してアプリケーション内のURLにリダイレクトすることが適切な場合があります。それを使用して外部URLにリダイレクトすることは、ドキュメントに適合しないようです。
J.フリッツバーンズ

1

上記の解決策はどれもうまくいきませんでした

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

これでうまくいきました。

または使用してみてください

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

0

あなたの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';
  }
}

あなたの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.