2017-03-05 72 views
2

我想写采用了棱角分明2和NPM官方elasticsearch.js客户端Elasticsearch一个简单的Web界面数据绑定。角2:使用Elasticsearch客户

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

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 
     }); 
    } 
} 

这似乎很好地工作。记录显示我的请求被正确回答。

这里是我的组件:

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'); 
    } 

} 

和这里的模板:

status:{{status}} 

我不明白为什么我的浏览器一直显示 “不正常”。我在这里错过了什么?

+0

没有你的供应商阵列中添加ElasticsearchService地方? –

+0

它在我的app.module.ts中,并且我尝试在我的组件中添加“提供程序:[ElasticsearchService]”(请参阅​​编辑) 仍然没有运气:( –

+0

您的请求是否实际发出?是否有对请求的响应,或者是有错误? – ryanlutgen

回答

2

我觉得视图不刷新的原因是elasticsearch客户端使用不是由Zone.js.拿起自己的递延/承诺实施

我发现了两个可能的解决方案:

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

后2:更换客户端的默认延迟方法。幸运的是,它很容易(我偷的想法从elasticsearch.jquery.js

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 
}); 

因为这是使用标准的承诺类,它是由区正确地拾起。

我仍在测试此为延迟简约更换()是否足够,但可能是因为它需要额外的方法。如果事情出现,我会发布更新。

+0

是的!谢谢你非常。这解决了我的问题:) –