routerExtensions.navigate не работает хорошо в этом приложении NativeScript - PullRequest
0 голосов
/ 23 июня 2019

У меня есть очень простой NativeScript / Angular проект, основанный на примере кода:

https://github.com/alexziskind1/nativescript-oauth2/tree/master/demo-angular

В основном это позволяет пользователю войти в систему с Google.

Сразу после того, как пользователь вводит свои учетные данные, он перенаправляется обратно в приложение, и его следует перенаправить на маршрут: /authenticated.

Моя проблема заключается в том, что в файле login.component.ts , когда вызывается метод this.routerExtensions.navigate(["/authenticated"]), в некоторых случаях пользователь перенаправляется на этот маршрут, а иногда нет.Я попытался немного выяснить, каковы обстоятельства, но это выглядит случайным.

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

Кроме того, я не знаю, нужно ли мне использовать:

this.routerExtensions.navigate(["/authenticated"])

или

this.routerExtensions.navigate(["../authenticated"])

В примере кода с официального сайта есть две точки (второй случай), как вы можете видеть здесь:

https://github.com/alexziskind1/nativescript-oauth2/blob/master/demo-angular/src/app/login/login.component.ts#L23

но, похоже, это не проблема.

Я думаю, что здесь что-то пропущено.

Ниже у вас есть некоторые фрагменты моего кода.

Есть идеи, как мне решить эту ситуацию?

Спасибо!

app.component.html

<!-- https://docs.nativescript.org/angular/core-concepts/angular-navigation.html#page-router-outlet -->
<page-router-outlet></page-router-outlet>

app-routing.module.ts

import { NgModule } from "@angular/core";
import { NativeScriptRouterModule } from "nativescript-angular/router";
import { Routes } from "@angular/router";

import { LoginComponent } from "./screens/login/login.component";
import { AuthenticatedComponent } from "./screens/authenticated/authenticated.component";
import { ItemsComponent } from "./item/items.component";
import { ItemDetailComponent } from "./item/item-detail.component";

const routes: Routes = [
    { path: "", redirectTo: "/login", pathMatch: "full" },
    { path: "login", component: LoginComponent },
    { path: "authenticated", component: AuthenticatedComponent },
    { path: "items", component: ItemsComponent },
    { path: "item/:id", component: ItemDetailComponent }
];

@NgModule({
    imports: [NativeScriptRouterModule.forRoot(routes)],
    exports: [NativeScriptRouterModule]
})
export class AppRoutingModule { }

login.component.html

<ActionBar title="My App" class="action-bar"></ActionBar>

<StackLayout class="form">

    <Button text="Login Social Network" (tap)="onTapLogin()" class="btn btn-primary btn-active"></Button>

</StackLayout>

login.component.ts

import { Component, OnInit } from "@angular/core";
import { RouterExtensions } from "nativescript-angular";
import { ITnsOAuthTokenResult } from "nativescript-oauth2";
import { Page } from "tns-core-modules/ui/page/page";
import { AuthService } from "../../services/auth.service";

@Component({
    templateUrl: "./login.component.html",
    styleUrls: ["./login.component.scss"],
})
export class LoginComponent implements OnInit {

    constructor(private page: Page, private authService: AuthService, private routerExtensions: RouterExtensions) {
    page.actionBarHidden = true;
    }

    ngOnInit(): void {

    }

    public onTapLogin() {
        this.authService
            .tnsOauthLogin("google")
            .then((result: ITnsOAuthTokenResult) => {
                console.log("back to login component with token " + result.accessToken);
                this.routerExtensions
                    .navigate(["/authenticated"])
                    .then(() => console.log("navigated to /authenticated"))
                    .catch(err => console.log("error navigating to /authenticated: " + err));
            })
            .catch(e => console.log("Error: " + e));
    }

}

auth.service.ts

import { Injectable } from "@angular/core";

import {
  TnsOAuthClient,
  ITnsOAuthTokenResult
} from "nativescript-oauth2";

@Injectable()
export class AuthService {
  private client: TnsOAuthClient = null;

  constructor() { }

  public tnsOauthLogin(providerType): Promise<ITnsOAuthTokenResult> {

    this.client = new TnsOAuthClient(providerType);

    return new Promise<ITnsOAuthTokenResult>((resolve, reject) => {
      this.client.loginWithCompletion(
        (tokenResult: ITnsOAuthTokenResult, error) => {
          if (error) {
            console.error("back to main page with error: ");
            console.error(error);
            reject(error);
          } else {
            console.log("back to main page with access token: ");
            console.log(tokenResult);
            resolve(tokenResult);
          }
        }
      );
    });

  }

  public tnsOauthLogout() {
    if (this.client) {
      this.client.logout();
    }
  }
}

1 Ответ

0 голосов
/ 24 июня 2019

В вашем случае, я думаю, что переход к authenticated будет правильным

this.routerExtension.navigate('authenticated'], {
    clearHistory: true
});

и очистка истории после успешного входа в систему.

Вы также можете попробовать this.routerExtension.navigateByUrl('/authenticated'), если выпредпочитайте это.

В любом случае вы можете быстро добавить полезную трассировку в свой модуль app-routing:

NativeScriptRouterModule.forRoot(routes, {
    enableTracing: true
})

Наконец, иногда это помогает добавить тайм-аут перед навигацией, например:

public onTapLogin() {
        this.authService
            .tnsOauthLogin("google")
            .then((result: ITnsOAuthTokenResult) => {
                console.log("back to login component with token " + result.accessToken);
                setTimeout( () => {
                    this.routerExtensions
                        .navigate(["/authenticated"])
                        .then(() => console.log("navigated to /authenticated"))
                        .catch(err => console.log("error navigating to /authenticated: " + err));
                }, 300);
            })
            .catch(e => console.log("Error: " + e));
    }

, но обычно это необходимо только для навигации при открытом модале.

EDIT : Итак, я попробовал ваш пример проекта и навигацию после подписи Googleпрекрасно работает для меняПоскольку вы получаете ошибку случайно, я думаю, это может быть только проблема синхронизации пользовательского интерфейса, так что мое последнее предложение с использованием setTimeout было бы правильным обходным путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...