gpt4 book ai didi

angular - 为什么在共享服务中使用 BehaviorSubject 而不是使用简单的共享变量?

转载 作者:行者123 更新时间:2023-12-04 14:39:44 25 4
gpt4 key购买 nike

我对使用 BehiavorSubject 而不是在服务中使用共享变量有点困惑。如果我创建一个带有共享变量的服务,甚至覆盖它们,Angular 组件也会检测到这些变化,那么我为什么要使用 BehiavorSubject 而不是共享变量?
例如,在我的项目中,我有一个导航栏,如果用户登录就会显示该导航栏,所以我有 ngIf service.isLoggedIn 并且它工作正常。为什么我需要一个服务中的 observable 并订阅它的事件。如果有人从不同的组件更改此值,它也会在此处更改。我是 angular 的新手,如果我遗漏了什么,请告诉我。
谢谢
(我正在关注这个例子:https://loiane.com/2017/08/angular-hide-navbar-login-page/)

最佳答案

是的,您说得对,可以使用共享变量,进而可以检测更改并更新 view因此 !
那我们为什么需要Subject or BehaviorSubject ?
简单的答案是 ,
当只是关于改变 View 时 直接根据更新的共享变量,如下所示,

 <div>Result : {{sharedService.result}}</div>
使用共享变量是有道理的。因此,在共享服务中,您只需更改 result10并立即 view将更新为 10值(value)。
但是
什么时候 result10 ,在(任何)组件中,你想运行一些代码/逻辑???你怎么能确定什么时候 result获取 10值,将运行一些逻辑(组件中的 ? )
像下面这样的东西,
some.component.ts
       if(sharedService.result === 10){  

// This code can not run with shared variable approach

}
问:我们可以在组件中编写类似上面的内容吗?
答:是的
Q:写完之后,会不会运行里面写的逻辑?
答:
问:为什么?
A:因为,共享变量是(使用服务)引用类型的。这意味着每当您更改该值时,应用程序中的所有引用都将更改(对于单例服务),但代码写入 some.component.ts不会运行或触发。
问:为什么?
A:因为在javascript/angular中,要执行这种类型的场景/代码,你应该有 callback的机制。 .
问:什么是回调?
A:可以作为参数传递给任何能够在主函数执行后自行执行的函数的函数。
这是理解BehaviourSubject所需的基本知识 .
现在当你定义一个 behaviourSubject在如下服务中,
Shared.Service.ts
    myBehaviorSubject = new BehaviourSubject(); // has ability to register a callback function     
您可以使用 myBehaviorSubject在以下任何组件中,
some.component.ts
    constructor(private sharedService:SharedService){

// below subscribe line registers a callback function with myBehaviorSubject.

this.sharedService.myBehavioirSubject.Subscribe((value)=>{ // This is callback function `(value)=>{...}`

if(value === 10){ // When value gets 10 value, below code will run automatically

// This code will run when condition is met

}
})
}
现在,behaviorSubject 有一些额外的机制来发出值。所以如果我发出 10来自任何地方的值(value),如 this.myBehaviourSubject.next(10) , 由于 behaviourSubject 的内部机制, 注册的回调函数将被调用。由于它是一个函数,当 10发出值后,回调函数将自行执行并运行函数内部编写的其他逻辑。
我希望,通过这种理解,您将能够理解为什么 shared variables不同于 behaviourSubject

关于angular - 为什么在共享服务中使用 BehaviorSubject 而不是使用简单的共享变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63055264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com