Angular 角度,RxJs服务存储-为什么行为Subject存储阵列数据比存储阵列数据更好?
在许多RxJs service store教程中(可能全部都是),行为子对象用于在store services中存储数据。 例如: 我想我会理解这个概念,如果在我的应用程序的某个地方我需要使用我的数组数据。但是,正如在教程中一样,行为主体是私有的,我需要使用服务方法来获取它的价值,所以我不能只订阅它 使用行为主体有什么真正的好处?使用数组更容易Angular 角度,RxJs服务存储-为什么行为Subject存储阵列数据比存储阵列数据更好?,angular,service,rxjs,store,Angular,Service,Rxjs,Store,在许多RxJs service store教程中(可能全部都是),行为子对象用于在store services中存储数据。 例如: 我想我会理解这个概念,如果在我的应用程序的某个地方我需要使用我的数组数据。但是,正如在教程中一样,行为主体是私有的,我需要使用服务方法来获取它的价值,所以我不能只订阅它 使用行为主体有什么真正的好处?使用数组更容易 存储数组数据的最佳方式是什么?数组数据来自api,在调用api时会被扩展。它是通过流处理数据。在您的链接中,您可以看到他们正在使用html模板中的as
存储数组数据的最佳方式是什么?数组数据来自api,在调用api时会被扩展。它是通过流处理数据。在您的链接中,您可以看到他们正在使用html模板中的
async
管道来循环todoStore.todo$
,这实际上会导致订阅您的observable
如果没有流(如果它是一个普通数组),即使您的ToDostoReserve更新了您的存储,您的html模板也不会更新,因为它不会收到更改数据的通知
这就是我对它的理解,不确定它是否完全正确,但我认为这就是本例中发生的情况。通过流处理数据。在您的链接中,您可以看到他们正在使用html模板中的
async
管道来循环todoStore.todo$
,这实际上会导致订阅您的observable
如果没有流(如果它是一个普通数组),即使您的ToDostoReserve更新了您的存储,您的html模板也不会更新,因为它不会收到更改数据的通知
这就是我理解它的方式,不确定它是否完全正确,但我认为这就是这个例子中发生的情况。我不是专家,但这就是我理解可观测数据的方式,以及它们相对于简单数组的好处
最终,我们希望一个值在模板中随时被动地更新自己,而无需手动检查 类似这样的内容:
{{observeData$| async}
observedData$
变量是一个可观察的变量(由结束$
的约定表示),它发送异步消息,可以使用async
管道在模板中展开
您的模板可以像使用简单数组一样轻松地使用它。例如,
{{[1,2,3]}
但可观察的只是一个数据流。想象一条河,它有一条定向的水分子流。但是“流”与其说是名词,不如说是动词 每一条河流都需要一个源头。水分子实际上来自哪里?
在
rxjs
中,可观测流的“源”称为主题
“可观察对象”除了提供一条从“源”/主题
到您订阅数据的任何地方的管道之外,什么都不“做”。就像花园里的软管除了引导水流通过外,什么都不“做”
现在,把一个行为主体
想象成一个具有指定初始值的主体
使用行为主体有什么真正的好处?使用数组更容易
使用BehaviorSubject
只需包含可观察流所需的几个片段中的一个片段
可观察到的流是异步的,并且会像无线电台一样向“收听”或订阅的人进行自我更新
一个简单的数组显然有一个更简单的语法来存储和提取数据,但是一个数组不能在没有人工干预的情况下跨多个组件进行自我更新。这是可观察流的值
此外,BehaviorSubject
是私有的,因为任何外部对象首先都不需要直接访问它。外部组件只需要访问一个可观察的流,而不需要访问BehaviorSubject
本身。如果组件可以访问流,则源与组件无关。最好保持它的私密性,并在同一个服务中使用一个函数来更新行为主体的值(如果需要)
例如
在服务中:
从'@angular/core'导入{Injectable};
从“rxjs”导入{BehaviorSubject,Observable};
@可注射({providedIn:'root'})
导出类示例服务{
private exampleSource=新行为主体(null);
示例$:Observable=this.exampleSource.asObservable();
updateSource(值:任意){
this.selectedDateSource.next(值);
}
}
我们正在定义一个初始值为null的BehaviorSubject
然后我们将example$
定义为可观察的(花园软管),以包含BehaviorSubject
发出的流
函数可以更新行为主体
的.next()
值,此时示例$
将通过流传输新值,每个订阅
将被动地看到其新值
然后,在组件中:
从'@angular/core'导入{Component,OnInit};
从“rxjs”导入{Observable};
@组成部分({
模板:`
{{exampleData$| async}}
`,
})
导出类ExampleComponent实现OnInit{
示例数据$:可观察;
构造函数(私有exampleService:exampleService){}
恩戈尼尼特(){
this.exampleData$=this.exampleService.example$;
}
}
此外,您可以手动订阅组件中的可观察对象,但是还有几个步骤需要执行,您还必须手动取消订阅可观察对象。
此功能有效地包含在前面示例中使用的Angular的内置async
管道中
T