Angular 2: передача данных от сервиса к компонентам - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть компонент страницы входа в систему, а также служба входа в систему, где я выполняю HTTP-вызов и получаю некоторые данные.В login.component.html при нажатии кнопки я запускаю функцию, которая, в свою очередь, запускает функцию, определенную в сервисе.Все это работает совершенно нормально.Теперь у меня есть другой компонент, где мне нужно использовать данные из этой службы входа в систему.Я думаю, что должен быть способ передачи данных между одноуровневыми компонентами или передачи непосредственно из службы в другой компонент.Я прошел через достаточное количество ресурсов по обмену данными и понял, но я не могу реализовать в моем текущем проекте.Может ли кто-нибудь помочь мне в этом, поскольку я все еще на этапе изучения Angular2?

Код службы входа в систему:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { LoginComponent } from './login/login.component';
import { switchMap, map } from 'rxjs/operators';
import { pipe } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class LoginService {
  //primaryverifydata: object;
  rootUrl = 'https://dev-510009.oktapreview.com/';
  constructor(public _http: HttpClient) {}
  primaryVerify1(userData) {
    let data = {
      username: userData.username,
      password: userData.pass,
      options: {
        multiOptionalFactorEnroll: true,
        warnBeforePasswordExpired: true
      }
    };
    return this._http
      .post(this.rootUrl + 'api/v1/authn', data, {
        headers: {
          'Content-type': 'application/json'
        }
      })
      .pipe(
        switchMap(response => {
          if (response.status == 'MFA_ENROLL') {
            let primaryverifydata = response;
            console.log('primaryverifydata', primaryverifydata);
            let data1 = {
              factorType: 'token:software:totp',
              provider: 'GOOGLE'
            };
            return this._http
              .post(
                this.rootUrl +
                  'api/v1/users/' +
                  primaryverifydata._embedded.user.id +
                  '/factors',
                data1,
                {
                  headers: {
                    'Content-type': 'application/json',
                    Authorization:
                      'SSWS 00e1Wq_tDwvikJt2ZufC0DgW58JX61R6BEQriGsvtl',
                    Accept: 'application/json'
                  }
                }
              )
              .pipe(
                map(response => {
                  if ((response.status = 'PENDING_ACTIVATION')) {
                    let enrollResponse = response;
                    window.open(
                      enrollResponse._embedded.activation._links.qrcode.href,
                      '_blank'
                    );
                    return response;
                  }
                })
              );
          }
        })
      );
  }
}

Код компонента входа в систему:

import { Component, OnInit } from '@angular/core';
import { LoginService } from '../login-service.service';
import { RouterModule, Routes, Router } from '@angular/router';
@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css'],
  providers: [LoginService]
})
export class LoginComponent implements OnInit {
  userData: object;
  pass: any;
  enrollResponse: object;
  constructor(private loginservice: LoginService, private router: Router) {
    this.userData = {};
    this.pass = '';
    this.enrollResponse = {};
  }
  ngOnInit() {}

  primaryVerify() {
    console.log(this.userData);
    let some = this.loginservice
      .primaryVerify1(this.userData)
      .subscribe(data => console.log(data));
  }
}

Второй компонент(где мне нужны данные):

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Component({
  selector: 'app-mfa',
  templateUrl: './mfa.component.html',
  styleUrls: ['./mfa.component.css']
})
export class MFAComponent {
  code: string;
  rootUrl = 'https://dev-900317.oktapreview.com/';
  constructor(public _http: HttpClient) {
    this.code = '';
  }
  verify() {
    let data = {
      passCode: this.code
    };
  }
}

1 Ответ

0 голосов
/ 29 декабря 2018

Если второй компонент является дочерним по отношению к первому, используйте аннотацию ViewChild или создайте общий ресурс и дайте им возможность получать данные оттуда.

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