Для первого примера вы можете использовать в сочетании с Асинхронный канал . Асинхронный канал откажется от вас:
В вашем ts
файле:
@Select(list) list: Observable<any>;
В вашем html
файле:
<ng-container *ngFor="let item of list | async">
</ng-container>
<!-- this will unsub automatically -->
Однако, если вы хотите использовать фактический метод подписки, вам нужно будет отменить подписку вручную. Лучший способ сделать это - использовать takeUntil
:
import {Subject} from 'rxjs';
import {takeUntil} from 'rxjs/operators';
@Component({
selector: 'app-some-component',
templateUrl: './toolbar.component.html',
styleUrls: ['./toolbar.component.scss']
})
export class SomeComponent implements OnInit, OnDestroy {
private destroy: Subject<boolean> = new Subject<boolean>();
constructor(private store: Store) {}
public ngOnInit(): void {
this.store.select(SomeState).pipe(takeUntil(this.destroy)).subscribe(value => {
this.someValue = value;
});
}
public ngOnDestroy(): void {
this.destroy.next(true);
this.destroy.unsubscribe();
}
}
Вы можете использовать pipe(takeUntil(this.destroy))
для каждой подписки в вашем компоненте без необходимости вручную добавлять unsubscribe()
для каждой из них.