【问题标题】:Bind Observable to template using async使用异步将 Observable 绑定到模板
【发布时间】:2018-01-19 08:49:26
【问题描述】:

我正在尝试通过以下方式将 Observable 绑定到 Angular 中的模板变量:

[class.active]="isBookmarked$ | async"

在 ngOnInit 中,我正在设置 Observable:

var promise = this.cacheService.getItem(this.bookmarkId).then(() => {
    return true;
}).then(() => {
    return false;
});
this.isBookmarked$ = Observable.fromPromise(promise);

当我加载页面时效果很好。但是当我添加或删除一个项目时,模板无法识别更改检测。

this.cacheService.removeItem(this.bookmarkId).then(() => { });
// or
this.cacheService.saveItem(this.bookmarkId, true, "bookmarks").then(() => { });

我尝试了不同的 Observable,也尝试了 Promise,但没有将其设为 Observable,但我无法让它工作。

【问题讨论】:

  • 但是当我添加或删除一个项目时,模板无法识别更改检测。您使用的是主题吗?因为变量this.isBookmarked 在第一个变量之后不会继续更新
  • 不,我没有使用主题。所以基本上你的意思是我需要一个共享主题,所以在你调用 removeItem/saveItem 之后,isBookmarked Observable 得到更新,对吧?
  • 是的.. 或者你需要以某种方式再次调用 getItem

标签: angular typescript asynchronous observable angular-pipe


【解决方案1】:

由于 promises 只会在您不会再次收到通知时触发。唯一的方法是将 cacheService 包装成一个新的服务(如果你不能改变原来的),像这样:

import { Subject } from "rxjs/Subject";
import "rxjs/add/operator/filter";
import "rxjs/add/operator/map";
import { Injectable } from '@angular/core';

interface CacheService
{
    getItem(key: any): Promise<any>;

    setItem(key: any, value: any): Promise<any>;
}

interface Item
{
    key: any;
    value: any;
}

@Injectable()
export class ObservableCacheService
{
    protected readonly items$ = new Subject<Item>();

    constructor(protected readonly cacheService: CacheService) { }

    getItem(key: any)
    {
        this.cacheService
            .getItem(key)
            .then(value => items$.next({ key: key, value: value }));
        return items$
            .filter(item => item.key === key)
            .map(item => item.value);
    }

    setItem(key: any, value: any)
    {
        this.cacheService
            .setItem(key, value)
            .then(() => items$.next({ key: key, value: value }));
    }
}

【讨论】:

  • 谢谢,下面的例子似乎有效。你是这个意思吗? gist.github.com/erwinokken/d4c7a21fecb9781c7fb79e331ac61d64
  • 是的,类似这样,但您没有按书签 ID 进行过滤 - 这样您将收到所有更改 - 而不仅仅是您在 exists 方法中指定的内容。
  • 谢谢,我在测试后注意到了。我现在开始工作了!
猜你喜欢
  • 2018-08-25
  • 1970-01-01
  • 2020-08-29
  • 2019-08-02
  • 1970-01-01
  • 2017-11-20
  • 2020-02-05
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多