Jef*_*rey 6 observable angular
我对angular2很新,我有点卡在某事上.
我创建了一个全局settings.service.此服务从API获取设置,并使用收集的数据填充设置模型.
服务:
public settings : settingsModel;
constructor(public http: Http){
this.setSettings()
.subscribe(
(data) => {
this.settings = data
});
}
setSettings() : Observable<any>{
return : this.http.get('/settings')
.map(response => response.json());
}
getSettings(){
return this.settings;
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,我在.map中测试返回数据时正确设置了设置
但是当我尝试从需要此数据的组件调用GetSettings时,它返回空.该服务在引导程序中定义.
我是否需要使'settings'变量可观察?任何帮助将非常感谢!
TNX!
在您的服务中使用BehaviorSubject.它已经共享,它将为新订阅者提供当前值(因此它为您进行缓存):
import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import {settingsModel} from 'settingsModel';
@Injectable()
export class MyService {
private _settingsSource = new BehaviorSubject<settingsModel>(null);
settings$ = this._settingsSource.asObservable();
constructor(private _http:Http) {
this._http.get('./settings.json')
.subscribe(response => {
//console.log('response', response)
this._settingsSource.next(response.json())
});
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用模板中的observable和asyncPipe,或者将数据提取到组件变量中:
this.settings$ = this._myService.settings$; // use with asyncPipe
this._myService.settings$.subscribe(data => this.settings = data);
Run Code Online (Sandbox Code Playgroud)
在Plunker中,我有一个等待4秒然后subscribe()是s 的子组件,以显示确实检索到最新/当前值.Plunker还演示了asyncPipe的使用.
我将使用do运算符将缓存实现到您的服务中:
private settings : settingsModel;
constructor(public http: Http){
this.settingsObservable = this.http.get('/settings')
.map(response => response.json())
.do(settings => {
this.settings = settings;
}).share();
}
getSettings() {
if (this.settings) {
return Observable.of(this.settings);
} else {
return this.settingsObservable;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8447 次 |
| 最近记录: |