Mam trochę problemów z zrozumieniem operatora Take (). W swojej definicji ma zamiar zwrócić pierwszą wartość emitowaną przez obserwowalny, ale dla mnie wydaje się, że jest to powrót ostatniego.

Próbowałem następujący test, aby lepiej go zrozumieć:

UżytkownicyService.ts.

import {User} from '../models/user.model';
import {BehaviorSubject} from 'rxjs';

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

  userObs = new BehaviorSubject<{test: string}>(null);

  testEmit(inp: string) {
    this.userObs.next({test: inp});
  }
}

I komponent.

Użytkownicy.comPonent.html.

  <div class="row">
    <div class="col-xs-12 col-md-6 col-md-offset-3">
      <input type="text" class="form-control" #inp>
      <button class="btn btn-primary" (click)="testTake(inp)">Emit</button>
    </div>
  </div>
</div> 

Użytkownicy.comPonent.ts.

import {Component, Input, OnDestroy, OnInit} from '@angular/core';
import {User} from '../models/user.model';
import {UsersService} from '../services/users.service';
import {interval, Observable, Observer, Subscription} from 'rxjs';
import {take} from 'rxjs/operators';

@Component({
  selector: 'app-users',
  templateUrl: './users.component.html',
  styleUrls: ['./users.component.css']
})
export class UsersComponent implements OnInit, OnDestroy {
  constructor(private usersService: UsersService) {
  }

  ngOnInit(): void {
    this.usersService.userObs.pipe(take(1)).subscribe((data: {test: string}) => {
      console.log(data.test);
    });
  }

  testTake(inp: HTMLInputElement) {
    this.usersService.testEmit(inp.value);
  }
}

W widoku wpisuję coś w wejściu i klikam przycisk, aby go emitować, a następnie idę do innego komponentu i wrócić do tego, aby przywrócić funkcję ONINIT () i co dostanę w konsoli, to ostatnia wartość, którą napisałem w wejściu. Czy patrzę na to niewłaściwy sposób?

Dziękuję za twój czas i pomoc.

0
Veoxer 26 lipiec 2020, 20:16

1 odpowiedź

Najlepsza odpowiedź

Jest to bardzo oczywiste, ponieważ zachowań ma charakterystykę, że przechowuje wartość "bieżącej". Oznacza to, że zawsze można bezpośrednio uzyskać ostatnią emitowaną wartość z zachowań .

I używasz usługi Singleton. Więc kiedy poruszasz się na inną trasę i wrócisz, będzie emitować, ostatnia przechowywana wartość.

Może to pomóc w zrozumieniu go dalej

Jeśli nie jest to, czego chcesz, polecam użyć Subject zamiast BehaviourSubject.

2
micronyks 26 lipiec 2020, 17:29