Невозможно отписаться от подписки ReplaySubject - PullRequest
0 голосов
/ 11 июня 2019

Я подписался на ReplaySubject и пытаюсь отписаться в методе ngOnDestroy. Когда я отхожу от компонента подписки и возвращаюсь к тому же компоненту без передачи данных, он снова получает подписку. Могу ли я узнать, как я могу решить эту проблему?

Shared.service.ts

import { Injectable } from '@angular/core';
import { TestCase } from './test-case-form/test-case.model';
import { Subject } from 'rxjs/Subject';
import { ReplaySubject } from 'rxjs/ReplaySubject';


@Injectable({
providedIn: 'root'
})
export class SharedService {
testCasesChanged = new Subject<TestCase[]>();
private startedEditing = new ReplaySubject<number>();
public startedEditing$ = this.startedEditing.asObservable();

setData(index) {
console.log("setData called", index);
this.startedEditing.next(index);
}
}

a.component.ts

export class TestFormComponent implements OnInit, OnDestroy {
@ViewChild('f') testForm : NgForm;
subscription: Subscription;
editIndex: number;
editMode = false;
editedTestCase: TestCase;

private testCases: TestCase[]= [];

ngOnInit() {
this.subscription = this.sharedService.startedEditing$
.subscribe((index: number) => {
console.log("Subscribed");
this.editIndex = index;
this.editMode = true;
this.editedTestCase = 
this.sharedService.getTestCase(this.editIndex);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}

Ответы [ 2 ]

0 голосов
/ 11 июня 2019
private startedEditing = new ReplaySubject<number>();

public startedEditing$ = this.startedEditing.asObservable(); 
// `startedEditing$` is no longer `startedEditing` they are now two different things

тогда вы делаете

this.startedEditing.next(index);

Какие только обновления startedEditing

startedEditing$ никогда не обновляется в коде, который вы предоставляете. Можно ли упростить и использовать только один?

0 голосов
/ 11 июня 2019

Ваша отписка в ngOnDestroy работает.

Вы получаете старые значения в вашем компоненте, потому что вы используете ReplaySubject. A ReplaySubject кэширует все значения, которые передаются вместе с ним. Поэтому каждый раз, когда вы подписываетесь на эту тему, ваш метод подписки вызывается для каждого значения, которое вы указали для этого ReplaySubject.

Размер буфера можно изменить с помощью:

// Only the last emitted value is cached and emitted to every new subscriptions
private startedEditing = new ReplaySubject<number>(1); 

Если вы хотите получить только последнее переданное значение, вы также можете использовать BehaviourSubject.

Но я думаю, вы просто хотите использовать простой Subject.

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