gpt4 book ai didi

javascript - 如何在 angular2 中重置 RxJS distinct

转载 作者:行者123 更新时间:2023-11-30 14:06:19 25 4
gpt4 key购买 nike

我需要实现无限滚动,因为我的后端响应仅限于 100 个项目。所以在第一页尝试时,我从后端收到 100 个项目。在每次滚动到页面末尾时,我都需要为另外 100 个项目调用端点。

在我的子组件 (BpHistoryListInfiniteComponent) 中,我设置了 data-load 属性以在 100. 元素出现时进行跟踪。然后在数据加载属性的 Subject(pageByScroll$) 值中设置 IntersectionObserver。我的 pageByScroll$ 需要从 0 开始(对于第一页尝试)并且我使用 distinct() 因为我需要 distinct 已经加载的项目,并且然后将该值发送到我的父组件。

但是在父组件中使用一个过滤器后,我需要将 index 值重置为 0 并将其和过滤器值发送到后端(并且只接收 100 个项目),然后如果用户滚动到底部我需要再次将我的 index 从 0 增加,但是 distinct() 不允许我这样做。

我需要以某种方式重置不同的值。

//子组件的html部分

<div #infiniteScrollMadness class="column">
<div *ngFor="let item of history; let i = index" class="list" [attr.data-load]="(i + 1) % 100 == 0 ? (i + 1) : null">
<span>{{ item.id }}</span>
<span>{{ item.name }}</span>
</div>
</div>

子组件的.ts部分

export class BpHistoryListInfiniteComponent implements AfterViewInit {
public pageByScroll$ = new Subject<number>();

@ViewChild("infiniteScrollMadness")
private scrollHost: ElementRef;

@Input()
history: HistoryModel;

@Input()
highlight: string;

@Output()
index = new EventEmitter<number>();

ngAfterViewInit() {
const intersectionObserver = new IntersectionObserver(
entries => {
entries
.filter(element => element.isIntersecting)
.forEach(element => {
this.pageByScroll$.next(
element.target.attributes["data-load"].value
);
});
},
{
threshold: 0.1
}
);
const mutationObserver = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (!mutation.addedNodes || mutation.type !== "childList") {
return;
}
const nodes = Array.prototype.slice.call(mutation.addedNodes, 0);

nodes.filter(node => node.nodeType === Node.ELEMENT_NODE)
.forEach((element: Element) => {
if (element.attributes["data-load"]) {
this.zone.runOutsideAngular(() => {
intersectionObserver.observe(element);
});
}
});
});
});

mutationObserver.observe(this.scrollHost.nativeElement, {
childList: true
});

this.pageByScroll$.pipe(
startWith(0),
distinct()
).subscribe(index => this.index.emit(index));
}

constructor(private zone: NgZone) {}
}

pageByScroll$ 流:
- 第一页尝试 => 值:0
- 滚动到底部 (+100) => 值:100
- 滚动到底部 (+100) => 值:200
- 滚动到底部 (+100) => 值:300
- 使用过滤器 => 值之一:0
- 滚动到底部 (+100) => 值:100
- 滚动到底部 (+100) => 值:200

最佳答案

你可以这样处理

this.resets$ = new Subject();
this.resets$.pipe(
startWith(null),
switchMap(() => this.pageByScroll$.pipe(
startWith(0),
distinct()
))
).subscribe(this.index);

this wil "scope"distinct operator to switchMap 你可以通过 this.resets$.next(null) 手动重置它/p>

关于javascript - 如何在 angular2 中重置 RxJS distinct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55317217/

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