Angular 角度,RxJs服务存储-为什么行为Subject存储阵列数据比存储阵列数据更好?

Angular 角度,RxJs服务存储-为什么行为Subject存储阵列数据比存储阵列数据更好?,angular,service,rxjs,store,Angular,Service,Rxjs,Store,在许多RxJs service store教程中(可能全部都是),行为子对象用于在store services中存储数据。 例如: 我想我会理解这个概念,如果在我的应用程序的某个地方我需要使用我的数组数据。但是,正如在教程中一样,行为主体是私有的,我需要使用服务方法来获取它的价值,所以我不能只订阅它 使用行为主体有什么真正的好处?使用数组更容易 存储数组数据的最佳方式是什么?数组数据来自api,在调用api时会被扩展。它是通过流处理数据。在您的链接中,您可以看到他们正在使用html模板中的as

在许多RxJs service store教程中(可能全部都是),行为子对象用于在store services中存储数据。 例如:

我想我会理解这个概念,如果在我的应用程序的某个地方我需要使用我的数组数据。但是,正如在教程中一样,行为主体是私有的,我需要使用服务方法来获取它的价值,所以我不能只订阅它

使用行为主体有什么真正的好处?使用数组更容易


存储数组数据的最佳方式是什么?数组数据来自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