简体   繁体   English

Angular 2 router.navigate在嵌套的js函数中不起作用

[英]Angular 2 router.navigate not working inside nested js function

Given the app module: 鉴于app模块:

import { NgModule }       from '@angular/core';
import { BrowserModule }  from '@angular/platform-browser';
import { FormsModule }    from '@angular/forms';
import { RouterModule }   from '@angular/router';
import {NgbModule} from '@ng-bootstrap/ng-bootstrap';

import { AppComponent }        from './app.component';
import {DashboardComponent} from "./components/dashboard/dashboard.component";
import {LogoutComponent} from "./components/logout/logout.component";
import {LoginComponent} from "./components/login/login.component";
import {HttpModule} from "@angular/http";
import {PrescribeComponent} from "./components/prescribe/prescribe.component";
//import { HeroService }         from './hero.service';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    NgbModule.forRoot(),
    RouterModule.forRoot([
      {
        path: 'dashboard',
        component: DashboardComponent
      },
      {
        path: 'logout',
        component: LogoutComponent
      },
      {
        path: 'login',
        component: LoginComponent
      },
      {
        path: 'prescribe',
        component: PrescribeComponent
      }

    ])
  ],
  declarations: [
    AppComponent,
    DashboardComponent,
    LogoutComponent,
    LoginComponent,
    PrescribeComponent
  ],
  providers: [
    //HeroService
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule {
}

Given the following component: 鉴于以下组件:

import {Component} from '@angular/core';
import {Router} from "@angular/router";
declare var ExternalJS: any;

@Component({
  selector: 'my-app',
  templateUrl: 'app/components/login/login.component.tpl.html',
})
export class LoginComponent {

  public redirect;
  public username: string;
  public password: string;

  constructor(public _router: Router) {

    this.username = 'someUsername';
    this.password = 'SomePassword';


  }
  doLogin() {

    var self = this;

    ExternalJS.authenticateByUser({username: this.username, password: this.password}, (response => {


     self._router.navigate(['/dashboard']);


    }));
  }

}

It navigates to dashboard, but the dashboard route disappears in the url. 它导航到仪表板,但仪表板路径在网址中消失。

So I am left with : http://localhost:3001/ Where I should see http://localhost:3001/dashboard . 所以我留下: http:// localhost:3001 /我应该在哪里看到http:// localhost:3001 / dashboard

If I move the self._router.navigate(['/dashboard']); 如果我移动self._router.navigate(['/ dashboard']); outside of the js function, it works fine. 在js函数之外,它工作正常。

UPDATE: 更新:

Doing the route change outside of the function works fine :( But i need it in the callback of the JS function. 在函数外部进行路由更改工作正常:(但我需要在JS函数的回调中。

 doLogin() {

    var self = this;
    self.goToRoute(); //MOVED TO HERE. WORKING FINE.

    /*ExternalJS.authenticateByUser({username: this.username, password: this.password}, ((response:any) => {   

           self.goToRoute();
         })


    }));*/
  }

UPDATE 3: 更新3:

Got it working based on Gunter Comments: 根据Gunter评论:

doLogin() {

    ExternalJs.authenticateByUser({username: this.username, password: this.password}, (response => {
      var self = this;
      ExternalJs.setUser(12398787, "user1", function () {
        ExternalJs.subscribeEvent({
          eventName: 'user.select',
          callback: (data => {
            self.zone.run(() => {
              self._router.navigate(['./dashboard']);
            });
          })
        });
      });
    }));
  }

UPDATE 4: The hash was still dissappearing event after adding zone. 更新4:添加区域后,哈希仍然消失。 I added this to app module: 我将此添加到app模块:

providers: [
    {provide: LocationStrategy, useClass: HashLocationStrategy}
  ]

, and it fixed the issue. ,它解决了这个问题。

You probably need to ensure the code is executed within Angulars zone, otherwise change detection won't run and this causes router.navigate() not to work as expected: 您可能需要确保代码在Angulars区域内执行,否则更改检测将不会运行,这会导致router.navigate()无法按预期工作:

constructor(public _router: Router, private zone:NgZone) {
ExternalJS.authenticateByUser({username: this.username, password: this.password}, (response => {
  this.zone.run(() =>  
    this._router.navigate(['/dashboard']);
  });
}));

If you use => there is no need for self 如果你使用=>则不需要self

I was actually able to resolve by creating this: 我实际上能够通过创建这个来解决:

 goToRoute(){

    this._router.navigate(['/dashboard']);

  }

Then: 然后:

ExternalJS.authenticateByUser({username: this.username, password: this.password}, (response => {
  self.goToRoute()
}));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM