【问题标题】:Cannot get and set value to BehaviorSubject in angular无法以角度获取和设置 BehaviorSubject 的值
【发布时间】:2020-03-20 12:04:55
【问题描述】:

我正在尝试向 BehaviorSubject 添加一个布尔值。但是,当我尝试控制台日志时,它说它是未定义的。我做错了什么?

这就是我的声明方式。

isDesktopWidth: BehaviorSubject<boolean>;

这就是我使用它的方式

changeSideBarWidth() {
if (this.innerWidth > 767) {
  this.isDesktopWidth.next(true);
} else {
  this.isDesktopWidth.next(false);
}

}

然后在 ngOnInit 中

this.changeSideBarWidth();
console.log(this.isDesktopWidth.value);

但它不会在控制台中显示任何内容。只有一个错误说

无法读取未定义的属性“下一个”

【问题讨论】:

    标签: angular observable behaviorsubject


    【解决方案1】:

    您已分配变量isDesktopWidth 的类型,但尚未对其进行初始化。试试

    isDesktopWidth = new BehaviorSubject<boolean>(false);
    

    BehaviorSubject 需要初始化一个值。如果您希望在没有初始化程序的情况下创建,请使用Subject。在这种情况下,您可以使用

    isDesktopWidth = new Subject<boolean>();
    

    它们之间的另一个区别是BehaviorSubject 持有一个值。因此,一旦您订阅它,它就会返回它持有的当前值。 Subject 不保存当前值。当您订阅它时,您将不会收到一个值,直到它发出下一个值。

    在未发送的Subject 上使用.value 属性将返回undefined

    【讨论】:

    • 谢谢@MichaelD,我还有另一个问题根本不会改变值...总是正确的,为什么会发生这种情况?
    • 根据您的情况,我假设 this.innerWidth 变量可能总是大于 767。
    • 其实不是,如果我将控制台记录innerWidth,它会更改屏幕大小数字。当它低于 767 时,它会记录我在 else 语句中输入的任何内容。
    • 然后尝试订阅它。在ngOnInit(),做this.isDesktopWidth.subscribe(r =&gt; { console.log(r); });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2020-03-08
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多