У меня возникли проблемы с пониманием оператора take(). В его определении предполагается, что он возвращает первое значение, испускаемое наблюдаемым, но мне кажется, что оно возвращает последнее.
Я попробовал следующий тест, чтобы понять это лучше:
UsersService.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});
}
}
и компонент.
пользователи.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>
пользователи.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);
}
}
В представлении я набираю что-то на входе и нажимаю кнопку, чтобы выдать его, а затем я перехожу к другому компоненту и возвращаюсь к этому, чтобы повторно запустить функцию OnInit(), и то, что я получаю в консоли, - это последнее значение, которое я написал на входе. Я смотрю на это неправильно?
Спасибо за ваше время и помощь.