带有事件/可观察对象的服务的成功/错误报告

时间:2016-06-02 14:36:04

标签: angularjs javascript-events angular observable

使用我在网上找到的一些文档,我已经编写了一种保存一些数据的服务方法:

@Injectable
export class BrandService {

  brands$: Observable<Brand[]>;
  private _brandsObserver: Observer<Brand[]>;
  private _dataStore: {
      brands: Brand[]
  };

  constructor(private http: Http) {
    this.brands$ = new Observable(observer => this._brandsObserver = observer).share();
    this._dataStore = { brands: []};
  }

  saveBrand(brand: Brand) {
    var headers = new Headers();
    headers.append('Content-Type', 'application/json');
    return this.http.post("http://localhost:8080/api/brands", JSON.stringify(brand), { headers: headers })
       .map( (response: Response) => response.json()).subscribe(
           data => {
             this._dataStore.brands.push(data);
             this._brandsObserver.next(this._dataStore.brands);
           }, 
           error => console.log("Could not create Brand"));
  }
}

这允许我做的是将更新推送到我的品牌系列,我在视图上的表格会观察这些更改并自动更新,因此我不必手动刷新它。一切都与世隔绝。

我的问题是,由于我订阅了服务中的http.post,我的组件现在无法知道此调用是否成功,这也意味着,因为我&#39;我在模态对话框中显示表单,我不知道是否应该关闭对话框或显示错误。我的组件只是这样做......

this._brandService.saveBrand(this.brandForm.value);

所以,我认为我应该找到一种方法来a)触发我在组件中监听的事件,以便当好/坏的事情发生时并采取相应的行动,或者b)数字以某种方式观察服务中的一些其他属性,我可以在检测到这些更改时对其进行操作。但我对所有这些可观察到的东西都很陌生,我甚至都不知道从哪里开始。

data => {
  this._dataStore.brands.push(data);
  this._brandsObserver.next(this._dataStore.brands);
  // fire some success event or
  // update some observed property
}, 
error => {
  // fire some failure event or
  // update some observed property
}

1 个答案:

答案 0 :(得分:1)

您可以在呼叫站点subscribe()进行

saveBrand(brand: Brand) {
    var headers = new Headers();
    headers.append('Content-Type', 'application/json');
    return this.http.post("http://localhost:8080/api/brands", JSON.stringify(brand), { headers: headers })
       .map( (response: Response) => response.json()).map(
           data => {
             this._dataStore.brands.push(data);
             this._brandsObserver.next(this._dataStore.brands);
           });
  }
this._brandService.saveBrand(this.brandForm.value)
.subscribe(
    value => onSuccess(),
    error => onError());

如果您仍希望在saveBrand中执行一些常规错误处理,则可以使用catch运算符(如Intercepting errors and subscribing to中所使用的那样)