Angular 如何使用参数依赖于其他选择器的ngrx选择器

Angular 如何使用参数依赖于其他选择器的ngrx选择器,angular,rxjs,ngrx,Angular,Rxjs,Ngrx,我正在尝试使用一个ngrx选择器,它接受一个jobId属性来返回一些数据作为一个可观察值 我首先从数据库中加载所有作业和任务,但它们没有及时返回选择器,我得到一个错误,因为this.task未定义,我相信这会阻止observable再次运行 在选择器尝试从存储区获取数据之前,是否有方法等待数据返回 this.store.dispatchfromTasks.loadAllTasks; this.store.dispatchfromJobs.loadAllJobs; taskSubscriptio

我正在尝试使用一个ngrx选择器,它接受一个jobId属性来返回一些数据作为一个可观察值

我首先从数据库中加载所有作业和任务,但它们没有及时返回选择器,我得到一个错误,因为this.task未定义,我相信这会阻止observable再次运行

在选择器尝试从存储区获取数据之前,是否有方法等待数据返回

this.store.dispatchfromTasks.loadAllTasks; this.store.dispatchfromJobs.loadAllJobs; taskSubscription$=this.store.pipe selectfromTask.getSelectedTask, taptask=>this.task=task.subscribe jobSubscription$=this.store.pipe 选择FromJob.getJobById,{jobId:this.task.jobId},
tapjob=>this.job=job.subscribe 您可以尝试使用RxJS过滤器

taskSubscription$=this.store.pipe selectfromTask.getSelectedTask, filtertask=>!!任务
taptask=>this.task=task.subscribe

您可以尝试使用RxJS过滤器

taskSubscription$=this.store.pipe selectfromTask.getSelectedTask, filtertask=>!!任务
TopTease= > Tea=任务。订阅< /p> < p>这里是一个可以考虑的方法:

1选择器getSelectedTask如果未选择任务,则返回null

export const getSelectedTask = createSelector(
  selectEntities,
  getSelectedTaskId,
  (entities: Dictionary<Task>, selectedId: number) => {
    return selectedId ? entities[selectedId] : null;
  }
)
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>

<>这是一个你可以考虑的方法:

1选择器getSelectedTask如果未选择任务,则返回null

export const getSelectedTask = createSelector(
  selectEntities,
  getSelectedTaskId,
  (entities: Dictionary<Task>, selectedId: number) => {
    return selectedId ? entities[selectedId] : null;
  }
)
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>

这是可行的,但缺点是。如果以后没有选择的任务,任务将不会被分配为null,在这种情况下,组件将不会得到通知。谢谢!这似乎有效,但我不确定为什么。你能解释一下这是怎么回事吗!!任务在做?!!任务的意思是“不是任务”。这就等同于任务==未定义和任务!==无效的在这种情况下,正如Thierry Falvo所写,this.task不会被分配给null。如果需要“null”,则可以显式写入任务!='“未定义”或使用他的解决方案。我希望你成功!这是可行的,但缺点是。如果以后没有选择的任务,任务将不会被分配为null,在这种情况下,组件将不会得到通知。谢谢!这似乎有效,但我不确定为什么。你能解释一下这是怎么回事吗!!任务在做?!!任务的意思是“不是任务”。这就等同于任务==未定义和任务!==无效的在这种情况下,正如Thierry Falvo所写,this.task不会被分配给null。如果需要“null”,则可以显式写入任务!='“未定义”或使用他的解决方案。我希望你成功!谢谢你的回答。如果选择器返回null,当它尝试运行tap操作时,是否仍会导致问题?在哪个tap操作中?您应该避免将逻辑放在tap运算符或subscribe中。更愿意创建一个新的选择器,例如getSelectedJobs,它将返回当前选定任务的所有作业。在这种情况下,您将能够测试getSelectedId或getSelectedTask,然后对getSelectedJobs也返回null。因此,在这种情况下,您的*ngIf也将完美工作。希望这会有帮助。谢谢你的回答。如果选择器返回null,当它尝试运行tap操作时,是否仍会导致问题?在哪个tap操作中?您应该避免将逻辑放在tap运算符或subscribe中。更愿意创建一个新的选择器,例如getSelectedJobs,它将返回当前选定任务的所有作业。在这种情况下,您将能够测试getSelectedId或getSelectedTask,然后对getSelectedJobs也返回null。因此,在这种情况下,您的*ngIf也将完美工作。希望这会有帮助。