我有一项全球服务,可以拯救一个行为主体.行为主体存储一个array.我有一个筛选器组件,它发出该数组的新版本,我可以看到全局服务上的更改.但是,在行为主体用作异步管道的情况下,视图中的值不会更改.
以下是我的做法:
在我的全球服务中,我有一门行为学科
public dataArray$: BehaviorSubject<Data[]> = new BehaviorSubject(someData);
个
筛选器组件将全局服务扩展为:
export class FilterComponent extends GlobalDataService
个
然后,触发器Filter函数更改原始数据(作为筛选器的基点),并为行为主体提供要发出的新值:
public triggerFilter(option: string): void {...
个
在函数内部,如下所示:
const filteredData = someData.filter(item => item.array.includes(option));
.
this.dataArray$.next(filteredData);
.
当在全局数据服务内部按如下方式订阅时:
constructor() { this.showcase$.subscribe((res) => console.log('service', res))}
个
我可以看到.Next方法正在被调用并打印出新的array.但是,使用它的任何位置的异步管道都不会向视图发出新值--因此过滤器无法工作……
<app-filter></app-filter>
<app-data-items></app-data-items>
在app-data-items中:
<ng-container *ngIf="dataArray$ | async as dataArray">
<span *ngFor="let data of dataArray" [ngStyle]="{ 'background-image': 'url(' + data.background + ')' }">
<app-data-details [data]="data"></app-data-details>
</span>
</ng-container>
当行为主体的值发生变化时,该视图不会更新.我的假设是,一旦在视图上定义了异步管道,就会自动打开订阅,并在更改后更改值?如果我说错了,这就是异步管道的要点?
我用的是16号角,现在我正在挠头,不知道为什么这个不能用.我曾考虑触发某种形式的更改检测策略(cdRef等),但这似乎是使用异步时的反措施?这应该通过异步管道来处理吗?
有没有人曾经遇到过这个问题,可以提供一些指导?