2016-06-28 172 views
0

我不知道我是否应该为此发布任何代码。但如果需要,我会。我有一个Angular2指令,MyDirective和一个服务MyService等待另一个observable继续之前

该服务在其构造函数中进行http调用以获取内容并存储在说this.list中。

指令注入服务并将其用作myService.isPresent(item)

现在,问题是,执行时间指令时,用于获取服务中列表的http调用未完成。有没有一种干净的方式让指令等到服务准备就绪?

回答

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从一个工作示例

+0

但随后这将导致多个http请求对吗?我怎样才能做出一个http请求,并防止所有后续的'loadData'调用忽略(但是在第一次调用完成后给它们回调) –

+0

因此,整个运行时的数据保持不变? – rinukkusu

+0

是的,它只是一个初始调用来获取和缓存。可能有更好的方法? –

相关问题