Angular2 全局变量可观察
Angular2 global variable observable
我是 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;
}
当我测试 .map
中的 return 数据时,这工作正常并且设置正确设置
但是当我尝试从需要此数据的组件调用 GetSettings 时,它 return 是空的。该服务在 bootstrap.
中定义
我需要让 'settings' 变量可观察吗?任何帮助将不胜感激!
谢谢!
我会使用 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;
}
}
你为什么不这样使用你的服务:-
public settings : settingsModel;
constructor(public http: Http){ }
GetSettings(){
return this.http.get('/settings')
.map(response => {
this.settings = response.json() // here setting your data to `this.setting`
return this.settings;
})
.catch(err => {
console.log(err) // handle your error as you want to handle
})
}
然后使用 .subscribe()
方法获取数据并显示在视图上
在您的服务中使用 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())
});
}
}
然后将模板中的可观察对象与 asyncPipe 一起使用,或者将数据提取到组件变量中:
this.settings$ = this._myService.settings$; // use with asyncPipe
this._myService.settings$.subscribe(data => this.settings = data);
在 Plunker 中,我有一个子组件等待 4 秒,然后等待 subscribe()
s,以表明确实检索到了 latest/current 值。 Plunker 还演示了 asyncPipe 的使用。
我是 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;
}
当我测试 .map
中的 return 数据时,这工作正常并且设置正确设置但是当我尝试从需要此数据的组件调用 GetSettings 时,它 return 是空的。该服务在 bootstrap.
中定义我需要让 'settings' 变量可观察吗?任何帮助将不胜感激!
谢谢!
我会使用 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;
}
}
你为什么不这样使用你的服务:-
public settings : settingsModel;
constructor(public http: Http){ }
GetSettings(){
return this.http.get('/settings')
.map(response => {
this.settings = response.json() // here setting your data to `this.setting`
return this.settings;
})
.catch(err => {
console.log(err) // handle your error as you want to handle
})
}
然后使用 .subscribe()
方法获取数据并显示在视图上
在您的服务中使用 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())
});
}
}
然后将模板中的可观察对象与 asyncPipe 一起使用,或者将数据提取到组件变量中:
this.settings$ = this._myService.settings$; // use with asyncPipe
this._myService.settings$.subscribe(data => this.settings = data);
在 Plunker 中,我有一个子组件等待 4 秒,然后等待 subscribe()
s,以表明确实检索到了 latest/current 值。 Plunker 还演示了 asyncPipe 的使用。