4

我有一个应用程序每 2 秒执行一次 HTTP 请求并更新视图。问题是,我必须做一些用户触发的 CSS 动画,这些动画大约需要一秒钟,并且经常被破坏,因为 Angular 在动画运行时更新了 DOM。

我使用Akita商店并像这样检索 observables:

this.dosingVessels$ = this.dosingVesselsQuery.selectAll().pipe(*needs rxjs operator magic*);

然后在组件中显示它们,如下所示:

    <app-solving-vessel *ngFor="let vessel of solvingVessels$ | async"
                    [vessel]="vessel"
                    [ngClass]="{'animation-class': hoverId === vessel.id}">
    </app-solving-vessel>

在动画进行时我怎么能做到这一点:

animate(event, vessel) {
    this.updateView.next(false); // prevent from updating
    this.hoverId = vessel.id; // triggers animation
    timer(1000).subscribe(tick => this.updateView.next(true)); // allow normal updating
}

视图没有更新。

我发现了 delayWhen 运算符,但所有示例都带有计时器,我不确定它是否是正确的方法。

4

2 回答 2

5

是否debounce支持您的需求?您可以将 Observable 传递给它,并且您的链将等到该 Observable 发出后再继续。如果你需要它等待一个特定的值,你也需要使用filter操作符。

我不确定在您的代码中究竟需要这个,但它可能看起来像这样:

this.dosingVesselsQuery.selectAll().pipe(
    debounce(() => 
        this.updateView
            .pipe(filter(val => val == true))
            .pipe(first())));

编辑:

看来您的需求会得到更好的支持debounce。我已经相应地编辑了我的帖子。

于 2018-08-28T11:27:46.553 回答
0

延迟可观察订阅或延迟可观察本身是帮助您的原因访问链接的方法,这基本上表明延迟发生在绝对时间。所以,基本上,您的代码应该像

this.dosingVessels$ = this.dosingVesselsQuery.selectAll().pipe(delaySubscription(1000));

或者

this.dosingVessels$ = this.dosingVesselsQuery.selectAll().pipe(delay(1000));
于 2018-08-28T11:27:40.283 回答