Angular2全局变量可观察

时间:2016-05-31 10:28:57

标签: angular 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

中的返回数据时工作正常并且设置正确

但是当我尝试从需要此数据的组件调用GetSettings时,它返回空。该服务在bootstrap中定义。

我是否需要使'settings'变量可观察?任何帮助将非常感谢!

TNX!

3 个答案:

答案 0 :(得分:7)

在您的服务中使用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())
      });
  }
}

然后使用模板中的observable和asyncPipe,或者将数据提取到组件变量中:

this.settings$ = this._myService.settings$;  // use with asyncPipe
this._myService.settings$.subscribe(data => this.settings = data);

Plunker

在Plunker中我有一个等待4秒然后subscribe() s的子组件,以显示确实检索到最新/当前值。 Plunker还演示了asyncPipe的使用。

答案 1 :(得分:3)

我会使用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;
  }
}

答案 2 :(得分:1)

为什么不使用这样的服务: -

  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()方法来获取数据并在视图中显示