Вот подход, который вы можете рассмотреть:
1) Селектор getSelectedTask
возврат null
если нет выбранной задачи
export const getSelectedTask = createSelector(
selectEntities,
getSelectedTaskId,
(entities: Dictionary<Task>, selectedId: number) => {
return selectedId ? entities[selectedId] : null;
}
)
2) Использование async
pipe и *ngIf
inside template
Component.ts
@Component({
selector: 'my-component',
...
})
export class MyComponent {
selectedTask$ = this.store.pipe(select(getSelectedTask));
...
}
Template.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();
}
}