首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular 2:使用Elasticsearch客户端绑定数据

Angular 2:使用Elasticsearch客户端绑定数据
EN

Stack Overflow用户
提问于 2017-03-05 21:13:57
回答 1查看 1.8K关注 0票数 2

我正在尝试使用Angular 2和npm的官方elasticsearch.js客户端为Elasticsearch编写一个简单的web界面。

我创建了一个类似这样的服务:

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { Client } from 'elasticsearch';

@Injectable()
export class ElasticsearchService {

    private _client: Client;
    constructor() {
        if (!this._client) {
            this._connect();
        }
    };
    private _connect() {
        this._client = new Client({
            host: 'http://my-elasticsearch-host:9200',
            log: 'trace'
        });
    };
    isAvailable(): PromiseLike<String> {
        return this._client.ping({
            requestTimeout: Infinity
        });
    }
}

这似乎工作得很好。日志记录显示请求得到了正确的响应。

下面是我的组件:

代码语言:javascript
复制
import { OnInit, Component } from '@angular/core';
import { ElasticsearchService } from './services/elasticsearch.service';

@Component({
    selector: 'foo',
    templateUrl: './foo.component.html',
    providers: [ElasticsearchService]
})
export class TimeLineComponent implements OnInit {

    private status: String = 'not ok';
    constructor(private esService: ElasticsearchService) { } ;

    ngOnInit(): void {
        this.showStatus();
    }

    showStatus(): void {
        this.esService.isAvailable()
            .then( response => this.status = 'OK' );
    }

}

下面是模板:

代码语言:javascript
复制
status:{{status}}

我不明白为什么我的浏览器一直显示“不好”。这里我漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-16 01:49:51

我认为视图不刷新的原因是elasticsearch客户端使用了它自己的延迟/承诺实现,而Zone.js并没有采用它。

我找到了两种可能的解决方案:

1:设置组件变量后的Run change detection manually

2:替换客户端默认的defer方法。幸运的是,这很简单(我从elasticsearch.jquery.js那里借鉴了这个想法)

代码语言:javascript
复制
function defer() {
  let resolve, reject, promise;

  promise = new Promise((_resolve, _reject) => {
    resolve = _resolve;
    reject = _reject;
  });

  return { resolve, reject, promise };
}

this.client = new Client({
  host: 'http://my-elasticsearch-host:9200',
  log: 'trace',
  defer: defer
});

因为它使用的是标准的Promise类,所以Zone会正确地拾取它。

我还在测试defer()的这种简约的替代方法是否足够,但它可能需要额外的方法。如果有什么问题,我会更新的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42608772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档