Поведение субъекта не обновляет подписчика на .next (значение) - PullRequest
0 голосов
/ 03 июня 2019

У меня проблема с получением субъекта поведения для обновления подписчика при вызове .next (значение).

Я новичок в машинописи, но думаю, мне просто не хватает чего-то маленького. это кажется правильным из того, что я видел.

На сайте было довольно много подобных проблем, но ни одна из них не устранила мою проблему. Это пример. Подписчик не получает значение от .next ()

RestService помещается только в массив провайдеров app.module.ts.

Файл Auth Guard (services / auth-guard.service.ts)


authenticated = false;

...

    ngOnInit(){
        this.restService.isLoggedIn().subscribe({
            next: result => {
                this.authenticated = result;
            }
        });
    }

...

    canActivate(route: ActivatedRouteSnapshot): boolean{

        console.log(this.authenticated);

        if(!this.authenticated){
            this.router.navigate(['login']);
        }
        return this.authenticated;
    }
}

Часть файла службы отдыха (services / rest.service.ts)

import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
import { RequestOptions } from '@angular/http';
import { Injectable } from '@angular/core';
import { Storage } from  '@ionic/storage';
import { Observable, BehaviorSubject } from  'rxjs';
import { User } from  'src/app/Interfaces/user';
import { tap } from 'rxjs/operators';

...

authSubject  =  new  BehaviorSubject(false);

...

public _setAuthSubject(value){
    this.authSubject.next(value);
 }

public isLoggedIn() {
    return this.authSubject.asObservable();
  }

В canActivate у меня есть консольный журнал, который показывает, что this.authenticated всегда ложно, но если я помещу другой абонентский вызов и напечатаю другую переменную под этим, я могу видеть, что это на самом деле сейчас, и оно было должным образом обновлено. Я что-то здесь упускаю, что приводит к тому, что аутентифицированный не обновляется?

Некоторая дополнительная информация. Вот мой app.module.ts

@NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [
    BrowserModule,
    IonicModule.forRoot(),
    AppRoutingModule,
    HttpClientModule,
    IonicStorageModule.forRoot()
  ],
  providers: [
    AuthGuardService,
    StatusBar,
    SplashScreen,
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
    SQLite,
    SQLitePorter,
    RestService,
  ],
  bootstrap: [AppComponent]
})

А также маршрутизация, которая вызывает службу auth guard (app-routing.module.ts)

import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
import { AuthGuardService } from './services/auth-guard.service';

const routes: Routes = [
  { path: '', loadChildren: './tabs/tabs.module#TabsPageModule', canActivate: [AuthGuardService]},
  { path: 'login', loadChildren: './login/login.module#LoginPageModule' },
];
@NgModule({
  imports: [
    RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
  ],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Наконец, здесь вызывается функция, которая на самом деле устанавливает для субъекта аутентификации значение true (login / login.page.ts)

constructor(
    public menu: MenuController,
    private restService: RestService,
    private router: Router,
    private storage: Storage
  ) { }


  async login(form){

    this.restService.login(form.value).subscribe({
      next: response => {
        console.log(response)
        if(response.access_token){
          this.storage.set("ACCESS_TOKEN", response.access_token);
          this.restService._setToken(response.access_token);
          this.restService._setAuthSubject(true);
        }
        this.router.navigateByUrl('');
      },
      error: err => {
        console.log('ERROR!: ', err)
      }
    });
  }

Ответы [ 2 ]

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

Я создал демо на BehaviourSubject, пожалуйста, посмотрите, может быть полезно для решения вашей проблемы.

https://stackblitz.com/edit/behavioursubject-angular-demo

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

модифицированный AuthGuard с кодом ниже. Службы не могут иметь код в ngOnInit, я понятия не имел! Ошибка нуби ... спасибо за помощь @ingkevin и @ lchraf.

    init(){
        this.restService.isLoggedIn().subscribe({
            next: result => {
                this.authenticated = result;
            }
        });
    }

    constructor(private router: Router, 
                public restService: RestService) {
                    this.init()
                }

ngOnInit был удален.

...