Предмет и наблюдаемый в Angular - PullRequest
0 голосов
/ 06 августа 2020

Я изучаю angular, и я немного зациклился на наблюдаемых и предметах. У меня есть служба, которая будет генерировать массив строк из HTTP-запроса в первый раз, когда приложение загружается, и он просто будет выдавать сохраненные данные.

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Subject, Observable } from 'rxjs';
import { map } from 'rxjs/operators';

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

  persons: string[];
  pesonChanged = new Subject<string[]>();
  isFirst= true;

  fetchPersons() {
    if(this.isFirst){
      this.http.get<any>('https://swapi.dev/api/people')
      .pipe(map(resData => {
        return resData.results.map(character => character.name);
      }))
      .subscribe(transformedData => {
        this.persons = transformedData;
        this.pesonChanged.next(transformedData);
      });
      this.isFirst = false;
    } else {
        this.pesonChanged.next(this.persons);
    }
  }

  addPerson(name: string) {
    this.persons.push(name);
    this.pesonChanged.next(this.persons);
  }

  removePerson(name: string){
    this.persons = this.persons.filter(person => {
      return person !== name;
    });
    this.pesonChanged.next(this.persons);
  }
  constructor(
    private http: HttpClient
  ) { }
}

В первый раз мой наблюдатель получит данные, но во второй раз ничего не получится, метод подписки не получит мои данные.

import { Service1Service } from './service1.service';
import { Component, OnInit, Output, EventEmitter, OnChanges, OnDestroy } from '@angular/core';
import { Input, ChangeDetectorRef, SimpleChanges } from '@angular/core';
import { HttpRequest, HttpClient } from '@angular/common/http';
import { ActivatedRoute, Router } from '@angular/router';
import { animation, transition } from '@angular/animations';
import { trigger, state, style, animate } from '@angular/animations';
import { Subscription } from 'rxjs';
import { timeout } from 'rxjs/operators';



@Component({
  selector: 'app-mdl',
  template: `
    <p *ngIf="isFetching">Loading...</p>
    <ul *ngIf="!isFetching">
      <li *ngFor="let p of personList" (click)="onRemove(p)">
        {{p}}
      </li>
    </ul>

  `,
  styles: [
  ],
  styleUrls: ['./animated-button.component.css'],
  animations: [

  ]
})
export class MdlComponent implements OnInit, OnChanges, OnDestroy{
personList: string[];
personListSubs: Subscription;
isFetching = true;
prova: any;

constructor(
  private myService: Service1Service
) {
}
ngOnInit(): void {
  if(this.myService.isFirst){
    this.myService.fetchPersons();
    this.personListSubs = this.myService.pesonChanged.subscribe(persons => {
      this.personList = persons;
      this.isFetching = false;
    });
  } else {
    this.myService.fetchPersons();
    this.personListSubs = this.myService.pesonChanged.subscribe(persons => {
      this.personList = persons;
      this.isFetching = false;
    });
  }
}
onRemove(p: string) {
  this.myService.removePerson(p);
}
ngOnChanges(changes: SimpleChanges): void {
}
ngOnDestroy() {
  this.personListSubs.unsubscribe();
}
}

Что я делаю не так?

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