как принять в охрану значение от авторизации службы. Столкнувшись с проблемой наблюдаемого - PullRequest
0 голосов
/ 01 ноября 2019

Я создал компонент с c input - name, button - send name. Эти данные обслуживаются с помощью json с именем и именем формы различия. Этот сервис открыл метод и создал наблюдаемую. Служба авторизации берет значение из службы имен и создает наблюдаемый метод. охрана использовала сервис авторизации с подпиской и доступом к страницам. Проблема - дважды нажмите кнопку авторизации.

import { Component, OnInit, Input, Output } from '@angular/core';
import { WorkbdService} from '../workbd.service';
import {db} from '../localDB'; 
import { AuthService } from '../auth.service';


@Component({
  selector: 'app-page-auth',
  templateUrl: './page-auth.component.html',
  styleUrls: ['./page-auth.component.scss']
})
 export class PageAuthComponent implements OnInit {
  name:string;
  pass:string;
  xuser:db[];
  constructor(private dbs:WorkbdService, private auth:AuthService) { }
  ngOnInit() {
    this.getData();
  }
  getData():void{
    this.dbs.getData().subscribe(users=>this.xuser=users);
  }
  formExecute(){
    let z=this.xuser.find(user=>user.login==this.name&&user.password==this.pass)
   console.log(`я больная копонента ${z.login}`)
    if(z.login){this.auth.setAuth(true); }
    else {this.auth.setAuth(false);}
  }
}
//html
<div>
    <label> User Name </label>
    <input type="text" [(ngModel)]="name">
    <label> Password </label>
    <input type="text" [(ngModel)]="pass">
    <button (click)="formExecute()" routerLinkActive="active" [routerLinkActiveOptions]="{exact:true}"><a routerLink='/about'>Войти</a></button>
</div>

service name

import { Injectable } from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {db} from './localDB';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class WorkbdService {

  constructor(private http:HttpClient) { }
  getData():Observable<db[]>{
    return this.http.get<db[]>('./assets/localDB.json')
  }
}

//auth service
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthService {

  constructor() { }
  isAuth:boolean;
  getAuth():Observable<boolean>{

    if(this.isAuth==false){
      console.log(`getAuth yes ${this.isAuth}`);
      return of(false);
    }
    else if(this.isAuth==true){console.log(`getAuth no ${this.isAuth}`); return of(true);}
    else {console.log(`im stupid argument ${this.isAuth}`); return of(false)}
  }
  setAuth(flag:boolean){
    this.isAuth=flag;
    this.getAuth();
  }
}

//my guard

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable, of} from 'rxjs';
import { map } from 'rxjs/internal/operators'
import {AuthService} from './auth.service';
import {Router} from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class MyGuardGuard implements CanActivate {

  constructor(private auth:AuthService, private route:Router){

  }
  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | boolean  {
      console.log("job of canactivate");

    return new Observable<boolean>(obj=>{
      this.auth.getAuth().subscribe(data=>{
        if(data==true){console.log("visible");obj.next(true);}
        else{console.log("false visible"); obj.next(false);}        
      })
    }) 
  } 
}
...