我不知道是否应该为此发布任何代码。但如果需要我会的。我有一个Angular2指令MyDirective
和一个服务MyService
该服务在其构造函数中进行http调用以获取内容并以this.list
存储。
Directive注入服务并将其用作myService.isPresent(item)
。
现在,问题在于,通过time指令执行,用于获取服务中列表的http调用尚未完成。有没有一种干净的方法让指令等到服务准备好了?
答案 0 :(得分:2)
不,由于http调用始终是异步的,因此您无法同步等待它们。
然而,您可以自己使用ReflectiveInjector
实例化服务,并在引导应用程序之前调用初始化,以确保所有内容都已加载。
在bootstrap
来电中,只需向您的MyService
实例提供数据。
//import ... from ...
import {MyService} from './my.service';
let injector = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS, MyService]);
var myService: MyService = injector.get(MyService);
myService.init()
.subscribe(data => {
bootstrap(App, [
HTTP_PROVIDERS,
provide(MyService, {useValue: myService})
])
.catch(err => console.error("error: ", err));
});
在MyService
添加此init
方法,为您的数据加载返回Observable
:
init(): Observable<any> {
if (!this._initialized) {
this._initialized = true;
return this._http.get(this._url)
.map(data => {
this._data = data.json();
return this._data;
});
}
else {
console.log("Already initialized!");
}
}
Plunker有一个工作示例