Angular 2 Прогон маршрутизации на новой вкладке

Я работаю с основным приложением asp.net с angular2, и моя маршрутизация работает нормально.

<a target="target" routerLink="/page1" routerLinkActive="active">Associates</a> 
<a routerLink="/page2" routerLinkActive="active">Account managers</a> 

Я хочу открыть каждую страницу ссылки (routerLink) в новой вкладке. Возможно ли, что каждая ссылка открыта в новой вкладке, не обновляя страницу?

Я пытался заменить routerLink="/Page2" на target="target" href="/associates" но страница обновляет все ссылки.

Ответ 1

Попробуйте, пожалуйста, <a target="_blank" routerLink="/Page2">


Update1: Пользовательские директивы для спасения! Полный код здесь: https://github.com/anandchakru/angular2-olnw

import { Directive, ElementRef, HostListener, Input, Inject } from '@angular/core';

@Directive({ selector: '[olinw007]' })
export class OpenLinkInNewWindowDirective {
    //@Input('olinwLink') link: string; //intro a new attribute, if independent from routerLink
    @Input('routerLink') link: string;
    constructor(private el: ElementRef, @Inject(Window) private win:Window) {
    }
    @HostListener('mousedown') onMouseEnter() {
        this.win.open(this.link || 'main/default');
    }
}

Уведомление: предоставляется окно и OpenLinkInNewWindowDirective, объявленный ниже:

import { AppAboutComponent } from './app.about.component';
import { AppDefaultComponent } from './app.default.component';
import { PageNotFoundComponent } from './app.pnf.component';
import { OpenLinkInNewWindowDirective } from './olinw.directive';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { RouterModule, Routes } from '@angular/router';

import { AppComponent } from './app.component';


const appRoutes: Routes = [
  { path: '', pathMatch: 'full', component: AppDefaultComponent },
  { path: 'home', component: AppComponent },
  { path: 'about', component: AppAboutComponent },
  { path: '**', component: PageNotFoundComponent }
];

@NgModule({
  declarations: [
    AppComponent, AppAboutComponent, AppDefaultComponent, PageNotFoundComponent, OpenLinkInNewWindowDirective
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    RouterModule.forRoot(appRoutes)
  ],
  providers: [{ provide: Window, useValue: window }],
  bootstrap: [AppComponent]
})
export class AppModule { }

Первая ссылка открывается в новом окне, вторая - не:

<h1>
    {{title}}
    <ul>
        <li><a routerLink="/main/home" routerLinkActive="active" olinw007> OLNW</a></li>
        <li><a routerLink="/main/home" routerLinkActive="active"> OLNW - NOT</a></li>
    </ul>
    <div style="background-color:#eee;">
        <router-outlet></router-outlet>
    </div>
</h1>

Тада!.. и приветствую =)

Обновление2:. Начиная с версии 2.4.10 <a target="_blank" routerLink="/Page2"> работает

Ответ 2

Это кажется немного смущенным.

Открытие приложения в другом окне или вкладке потребует повторной загрузки, а затем для вашего маршрутизатора... забрать этот URL-адрес, преобразовать его в маршрут и загрузить соответствующий компонент.

Это именно то, что произойдет, если вы просто используете ссылку. На самом деле все это происходит.

Точка маршрутизатора заключается в замене компонентов на выходе маршрутизатора и выходе из него, который был загружен и существует в пределах вашего запущенного приложения и не используется в разных окнах.

Ответ 3

Эта директива работает как замена [routerLink]. Все, что вам нужно сделать, это заменить ваши [routerLink] обычаями [link]. Он работает с ctrl + click, cmd + клик, средний клик.

import {Directive, HostListener, Input} from '@angular/core'
import {Router} from '@angular/router'
import _ from 'lodash'
import qs from 'qs'

@Directive({
  selector: '[link]'
})
export class LinkDirective {
  @Input() link: string

  @HostListener('click', ['$event'])
  onClick($event) {
    // ctrl+click, cmd+click
    if ($event.ctrlKey || $event.metaKey) {
      $event.preventDefault()
      $event.stopPropagation()
      window.open(this.getUrl(this.link), '_blank')
    } else {
      this.router.navigate(this.getLink(this.link))
    }
  }

  @HostListener('mouseup', ['$event'])
  onMouseUp($event) {
    // middleclick
    if ($event.which == 2) {

      $event.preventDefault()
      $event.stopPropagation()
      window.open(this.getUrl(this.link), '_blank')
    }
  }

  constructor(private router: Router) {}

  private getLink(link): any[] {
    if ( ! _.isArray(link)) {
      link = [link]
    }

    return link
  }

  private getUrl(link): string {
    let url = ''

    if (_.isArray(link)) {
      url = link[0]

      if (link[1]) {
        url += '?' + qs.stringify(link[1])
      }
    } else {
      url = link
    }

    return url
  }
}

Ответ 4

В моем случае я хотел асинхронно получить URL-адрес, а затем перейти по этому URL-адресу к внешнему ресурсу в новом окне. Директива казалась излишней, потому что мне не нужно многократное использование, поэтому я просто сделал:

<button (click)="navigateToResource()">Navigate</button>

И в моем component.ts

navigateToResource(): void {
  this.service.getUrl((result: any) => window.open(result.url));
}


Замечания:

Маршрутизация на ссылку, косвенно подобную этой, вероятно, вызовет блокировку всплывающих окон браузера.