Javascript 角度2-rxjs-可观测阵列

Javascript 角度2-rxjs-可观测阵列,javascript,angular,typescript,ionic2,rxjs,Javascript,Angular,Typescript,Ionic2,Rxjs,在我的模板中,我订阅了一个可观察数组,如下所示: <div *ngFor="let item of activities | async">...</div> 有什么想法吗?对于默认值为空数组的运算符来说,这似乎是一个理想的情况 本例将五个值缓冲到一个数组中,然后将它们与前一个数组合并,以便连续打印不断增加的值数组。这应该与您试图通过无限卷轴实现的目标相同: Observable.interval(100) .bufferCount(5) .scan((acc,

在我的模板中,我订阅了一个可观察数组,如下所示:

<div *ngFor="let item of activities | async">...</div>

有什么想法吗?

对于默认值为空数组的运算符来说,这似乎是一个理想的情况

本例将五个值缓冲到一个数组中,然后将它们与前一个数组合并,以便连续打印不断增加的值数组。这应该与您试图通过无限卷轴实现的目标相同:

Observable.interval(100)
  .bufferCount(5)
  .scan((acc, val) => {
    acc = acc.concat(val);
    return acc;
  }, [])
  .subscribe(val => console.log(val));
见现场演示:


当然,您将使用一些远程服务,而不是
Observable.interval()
,但我想您明白了这一点。

我在一个应用程序中使用了Redux store。下面的链接解释了为什么这样做是个好主意,并展示了如何做的代码示例。应该符合你的情况。最重要的是,如果您不使用这种方法,请注意数据的突变及其对变化检测的影响。在第二个链接中解释


我认为您可以设置两个源并使用concat之类的工具

let source1 = Rx.Observable.return(getActivities);
let source2 = Rx.Observable.return(getMoreActivities);
let scrollevent$ = new BehaviourSubject();
source2.skipUntil( scrollevent$ ); // ignore until this creates a value.
然后

let source = Rx.Observable.concat(source1, source2)
    .subscribe( activities => ... );

onScroll() {
 scrollevent$.next(null);
}

您可以(并且应该)覆盖现有的可观察数组。如果您有性能问题,您可以使用
ChangeDetectionStrategy.OnPush
,如果您改变数组,它将不起作用,这就是为什么最好覆盖它。将下载的数据保存在一个地方,并使用此数据的过滤副本进行显示…谢谢,我在发布问题后立即开始使用scan。这就引出了另一个问题。在您的示例中,interval()会发出,但如果没有像interval这样的可观察方法,我无法理解如何执行此操作,因为我的所有网络请求都是在订阅之后发出的。您可以在
scan()
之前使用
merge()
合并其他可观察对象(或者在您的案例主题中)这会将数据发送到
scan()
操作符。我想看看这样的商店,谢谢,但在我相对简单的任务中,这有点极端。这个概念仍然有效。如果您将数据视为不可变的,并且只有一个位置(在服务中)可以更改它们(通过创建新的对象引用),那么一切都将正常工作。
Observable.interval(100)
  .bufferCount(5)
  .scan((acc, val) => {
    acc = acc.concat(val);
    return acc;
  }, [])
  .subscribe(val => console.log(val));
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
...
let source1 = Rx.Observable.return(getActivities);
let source2 = Rx.Observable.return(getMoreActivities);
let scrollevent$ = new BehaviourSubject();
source2.skipUntil( scrollevent$ ); // ignore until this creates a value.
let source = Rx.Observable.concat(source1, source2)
    .subscribe( activities => ... );

onScroll() {
 scrollevent$.next(null);
}