Angular 2 Routing run in new tab

前端 未结 5 1415
时光取名叫无心
时光取名叫无心 2020-11-29 06:49

I am working with a asp.net core application with angular2 and my routing is working fine.



        
相关标签:
5条回答
  • 2020-11-29 07:29

    Try this please, <a target="_blank" routerLink="/Page2">


    Update1: Custom directives to the rescue! Full code is here: https://github.com/pokearound/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');
        }
    }
    

    Notice, Window is provided and OpenLinkInNewWindowDirective declared below:

    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 { }
    

    First link opens in new Window, second one will not:

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

    Tada! ..and you are welcome =)

    Update2: As of v2.4.10 <a target="_blank" routerLink="/Page2"> works

    0 讨论(0)
  • 2020-11-29 07:29

    In my use case, I wanted to asynchronously retrieve a url, and then follow that url to an external resource in a new window. A directive seemed overkill because I don't need reusability, so I simply did:

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

    And in my component.ts

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


    Note:

    Routing to a link indirectly like this will likely trigger the browser's popup blocker.

    0 讨论(0)
  • 2020-11-29 07:38

    This seems a little confused.

    Opening your application in another window or tab will require your entire application to be re-bootstrapped, and then for your router to... pick up that url, convert it into a route, and load the appropriate component.

    This is exactly what will happen if you just use a link instead. In fact, that's all that's happening.

    The point of the router is to swap components in and out of your router-outlet, which is something that's been bootstrapped and exists within the confines of your running application and isn't shared across multiple windows.

    0 讨论(0)
  • 2020-11-29 07:47

    Late to this one, but I just discovered an alternative way of doing it:

    On your template,

    <a (click)="navigateAssociates()">Associates</a> 
    

    And on your component.ts, you can use serializeUrl to convert the route into a string, which can be used with window.open()

    navigateAssociates() {
      const url = this.router.serializeUrl(
        this.router.createUrlTree(['/page1'])
      );
    
      window.open(url, '_blank');
    }
    
    0 讨论(0)
  • 2020-11-29 07:48

    This directive works as a [routerLink] replacement. All you have to do is to replace your [routerLink] usages with [link]. It works with ctrl+click, cmd+click, middle click.

    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
      }
    }
    
    0 讨论(0)
提交回复
热议问题