我们应该取消订阅 ngxs Selector 吗?
Should we unsubscribe from ngxs Selector?
我正在使用 ngxs 状态管理。我需要取消订阅选择器还是由 ngxs 处理?
@Select(list)list$!: Observable<any>;
this.list$.subscribe((data) => console.log(data));
是的,如果您在组件中手动订阅,则需要取消订阅。
最好尽可能避免这种情况,并使用 async
管道在组件模板中订阅。
对于第一个例子你可以结合使用Async pipe。 Async 管道将为您取消订阅:
在您的 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()
。
Async Pipe 解决方案通常是最好的。
根据您的用例,您还可以使用 first() 运算符。
observable.pipe(first()).subscribe(...)
它比 takeUntil 方法更短,您不需要任何退订。
https://www.learnrxjs.io/operators/filtering/first.html
注意:这将 return 一个值并退订。因此,如果您需要商店的当前值然后用它做一些事情,就可以使用它。不要用它在 GUI 上显示某些东西 - 它只会显示第一个更改:)
我正在使用 ngxs 状态管理。我需要取消订阅选择器还是由 ngxs 处理?
@Select(list)list$!: Observable<any>;
this.list$.subscribe((data) => console.log(data));
是的,如果您在组件中手动订阅,则需要取消订阅。
最好尽可能避免这种情况,并使用 async
管道在组件模板中订阅。
对于第一个例子你可以结合使用Async pipe。 Async 管道将为您取消订阅:
在您的 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()
。
Async Pipe 解决方案通常是最好的。
根据您的用例,您还可以使用 first() 运算符。
observable.pipe(first()).subscribe(...)
它比 takeUntil 方法更短,您不需要任何退订。
https://www.learnrxjs.io/operators/filtering/first.html
注意:这将 return 一个值并退订。因此,如果您需要商店的当前值然后用它做一些事情,就可以使用它。不要用它在 GUI 上显示某些东西 - 它只会显示第一个更改:)