javascript - Angular2 表单控件 valueChanges 可观察完成从未调用

标签 javascript typescript angular rxjs observable

我目前正在尝试在搜索进行时在我的搜索栏上显示一个简单的加载程序。我计划在从我的表单控件观察到的 valueChanges 的订阅回调中将一个变量设置为值“loading”,并在完整的回调中将其设置为一个空字符串。但是,永远不会调用完整的回调。

我也尝试在 finally 上添加一个回调,但它也从未被调用过。

我的代码:

searchBox: Control = new Control();
loadingClass: string = "";

constructor() {
    this.searchBox.valueChanges
            .debounceTime(400)
            .distinctUntilChanged()
            .subscribe((text: string) => {
                this.imageSearch = text;
                this.loadingClass = "loading";
            }, (err: Error) => {
                console.log(err);
            }, () => {
                this.loadingClass = "";
                console.log("test");
            });
}

最佳答案

这很正常,因为可观察对象永远不会完成。 valueChanges 允许您从搜索框中接收值。事实上,您希望在搜索操作完成时收到通知。

所以我会尝试类似的方法,假设 searchImage 确实进行了搜索并返回了一个可观察对象:

constructor() {
  this.searchBox.valueChanges
              .debounceTime(400)
              .distinctUntilChanged()
              .flatMap((text:string) => { // <-------
                this.loadingClass = "loading";
                return this.searchImage(text);
              })
              .subscribe((searchResult) => {
                  this.imageSearch = searchResult;
                  this.loadingClass = ""; // <----
              }, (err: Error) => {
                  console.log(err);
              });
}

flatMap 运算符的使用见这篇文章:

关于javascript - Angular2 表单控件 valueChanges 可观察完成从未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37531619/

相关文章:

css - 如果需要自动调整 mat-table 行

javascript - polymer iron-ajax调用以及如何在绑定(bind)发生之前修改/过滤响应?

TypeScript 类型覆盖工具

javascript - 如何在 Angular 应用程序中使用 OrientDB HTTP API?

javascript - 显示来自 Web 服务的数据(Js、Angular)

jquery - 如何在 ionic 2 Angular 应用程序中包含 jQuery

angular - 使用 angular2 在网络浏览器上显示 shapefile map

javascript - Angular 2无法在html页面中显示项目列表

javascript - 加载后触发的类方法,之后不起作用

javascript - Angular js自定义过滤器未定义