Як перенаправити на зовнішню URL-адресу в Angular2?


173

Який спосіб перенаправити користувача до повністю зовнішньої URL-адреси в Angular 2. Наприклад, якщо мені потрібно перенаправити користувача на сервер OAuth2 для аутентифікації, як би це зробити?

Location.go(), Router.navigate()і Router.navigateByUrl()добре підходять для відправки користувача на інший розділ (маршрут) у програмі Angular 2, але я не бачу, як їх можна використовувати для переадресації на зовнішній сайт?


4
Хіба вам не смішно, що це зробити не так просто? Має бути простіший спосіб зробити це, не маючи для цього коду.
Маккурт

3
Примітка. Якщо ваша зовнішня URL-адреса не містить http: // або https: //, Angular 4 розглядатиме URL як внутрішній маршрут. У випадку, якщо хтось із цим бореться.
aherocalledFrog

Відповіді:


214

Ви можете використовувати це-> window.location.href = '...';

Це змінить сторінку на все, що ви хочете ..


3
Фу, я спробував викликати це як функцію з якоїсь причини, а не просто змінити значення. Встановлення значення безпосередньо працює.
Михайло Ориль

9
Просто пам’ятайте, що пряме посилання на вікно обмежить ваш код платформами з об’єктом вікна.
ендер

2
@ender немає альтернативи цьому? Можуть бути сценарії, коли ми справді хочемо перенаправити на зовнішні посилання. Звичайно, ми можемо використовувати window.location.href, але, як ви кажете, у нього є свої недоліки. Якщо в Angular є підтримуваний API, це допоможе краще.
Крішнан

1
Зрозуміло, але це 99% усіх платформ, на яких працює JavaScript і потрібно зробити переспрямування сторінки. Навіть фантоми / casperJs поважають предмет вікна. Ви можете телефонувати document.location.hrefабо навіть у Location.hrefтому випадку, коли всі вони посилаються на один і той же об’єкт. Довідка про місцезнаходження
Денніс Смолек

2
@DennisSmolek Але якщо ви спробуєте скомпілювати це в додатку для Android за допомогою Universal, чи не вдалося б ця поведінка провалитися?
закінчується

124

Кутовий підхід до раніше описаних методів полягає в імпорті DOCUMENTз @angular/common(або @angular/platform-browserв Angular <4) та використанні

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>

Ознайомтеся з табличкою форматуBrowser repo для отримання додаткової інформації.


Чи хотів би цільовий сайт знати, що запит надходить від нашого додатка, оскільки вимога тут полягає в переадресації з метою входу, а значить, програма SSO повинна переспрямувати назад до нашого додатку після успіху
NitinSingh

5
У куті 4 DOCUMENT слід імпортувати з @angular/common(тобто import { DOCUMENT } from '@angular/common';), але в іншому випадку це чудово працює! Дивіться github.com/angular/angular/blob/master/packages/…
Джон

4
яка мета введення документа таким чином@Inject(DOCUMENT) private document: any
Суніл Гарг

1
@SunilGarg Ін'єкція DOCUMENTполегшує заміну об’єкта документа макетом в одиничних тестах. Він також дозволяє використовувати альтернативну реалізацію на інших платформах (сервер / мобільний).
епсілон

3
Я використовую строгий набір тексту,constructor(@Inject(DOCUMENT) private document: Document) { }
Іван Джеймісон,

38

Як сказав Денніс Смолек, рішення є мертвим простим. Встановіть window.location.hrefURL, на який потрібно перейти, і він просто працює.

Наприклад, якщо ви мали цей метод у файлі класу (контролері) вашого компонента:

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

де ви знайдете роутер.

--- EDIT --- На жаль, я, можливо, помилявся у наведеному вище прикладі. Принаймні, це не працює так, як очікувалося в моєму виробничому коді зараз - тож, поки я не встигну дослідити далі, я вирішу його так (оскільки моєму додатку справді потрібен гачок, коли це можливо)

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(['/']);це те, що це зробило для мене.
Метт Роулз

2
Кутове 2 Місцезнаходження не звучить. Документи стверджують, що метою розташування є: "Місце розташування відповідає за нормалізацію URL-адреси щодо базової href програми." Використання цього для переадресації на URL-адресу в програмі може бути доречним; використовуючи його для переадресації на зовнішню URL-адресу, схоже, не відповідає документам.
Дж. Фріц Барнс

1

Жодне з перерахованих вище рішень для мене не працювало, я лише додав

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

Це працювало для мене.

Або спробуйте використовувати

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

0

У своєму компоненті.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';
  }
}

У своєму компоненті.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;**
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.