【问题标题】:Subscribing to a Selector returns Undefined订阅选择器返回未定义
【发布时间】:2018-10-19 16:39:17
【问题描述】:

我有一个向孩子提供信息的选择器。选择器工作并且子组件构建正确但是,我想订阅父组件中的选择器并将信息用于不同的任务,但订阅返回一个未定义的值。谁能指出我哪里出错了?

代码:

size: any;
mySubscription: Subscription;

constructor(
    private AppStore: Store<Store.NewState>
  ) { }

  ngOnInit() {
       this.position$ = this.AppStore.select(positionSelectors.selectPositionState);
       if (!this.position$ === undefined) {
         this.mySubscription = this.position$.subscribe((resp) => {
         this.size = Object.keys(resp).length;
        } );
        this.mySubscription.unsubscribe();
       }
  }

所以我试图获得响应的长度,但是没有任何东西超过条件。如果我删除它,我会收到一堆错误,指出对象未定义。 具体错误是:

TypeError: Cannot convert undefined or null to object

【问题讨论】:

  • 试试:if (this.position$ !== undefined) {...}
  • 您尝试创建订阅...但您立即取消订阅。尝试取消订阅您的 ngOnDestroy 或使用 rxjs 方法,例如 take(x)
  • 两者都有效,但位置的值未定义,这就是问题所在。为什么我的选择器有效,但订阅返回一个未定义的值?

标签: angular typescript ngrx subscription


【解决方案1】:

根本原因,

!this.position$ 之前的否定变为 false 那么你是严格的 用 undefined 检查它,它永远不会进入 if 块,因为它总是将它评估为 false

根据评论建议,请使用 ngOnInit 和 ngOnDestroy 生命周期,请检查下面的代码 sn-p

ngOnInit() {
  this.position$ = this.AppStore.select(positionSelectors.selectPositionState);
  if(!this.position$) this.mySubscription = this.position$.subscribe(() => console.log("Logic Here"));
}

ngOnDestroy() {
  if(this.mySubscription) this.mySubscription.unSubscribe();
}

【讨论】:

  • 如上所述,这不是问题。如果您删除条件,它仍然会引发相同的错误。我已经纠正了不好的做法。但是,问题的根源在于错误消息所述...订阅后的值未定义。
  • @Haq.H 您是否尝试查看问题是否不是发出的初始状态?
  • 是的,初始状态没有问题,我测试了选择器的输出,它工作正常。问题出在我的订阅上,但我不知道在哪里。
  • @Haq.H 如果可能,请您分享您的选择器和状态的代码
  • 选择器和状态工作正常。我使用那个选择器向孩子发送信息,它工作正常,如原始问题中所述。
猜你喜欢
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2020-08-31
  • 2020-12-18
相关资源
最近更新 更多