这是您可以考虑的一种方法:
1) 选择器getSelectedTask 如果没有选择任务则返回null
export const getSelectedTask = createSelector(
selectEntities,
getSelectedTaskId,
(entities: Dictionary<Task>, selectedId: number) => {
return selectedId ? entities[selectedId] : null;
}
)
2) 在模板内使用async 管道和*ngIf
组件.ts
@Component({
selector: 'my-component',
...
})
export class MyComponent {
selectedTask$ = this.store.pipe(select(getSelectedTask));
...
}
模板.html
<ng-container *ngIf="selectedTask$ | async as selectedTask else noSelection">
<my-task [task]="selectedTask"></my-task>
// or
<span>{{ selectedTask.description }}</span>
</ng-container>
<ng-template #noSelection>
Please select a task !
</ng-template>
通过这种方法,您将使用带有角度模板语法的强大的可观察对象。
如果用户取消选择当前任务,getSelectedTask 选择器将返回null,模板将自动更新。
尽管如此,您可以继续使用subscription,但在这种情况下,最好在subscribe 方法中设置值并确保取消订阅。
@Component({
selector: 'my-component',
...
})
export class MyComponent implements OnInit, OnDestroy {
subscription: Subscription;
selectedTask$ = this.store.pipe(select(getSelectedTask));
selectedTask: Task;
constructor(
private store: Store<AppState>
) { }
ngOnInit() {
this.subscription = this.selectedTask$.subscribe(task
=> this.selectedTask = task);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}