Angular如何绑定服务实例并将其保存在不同的类

时间:2018-05-29 22:24:11

标签: javascript angular typescript multiple-inheritance angular-components

如何从子类中传递超类中的服务方法? 我有下一个服务

import { Injectable, Injector } from '@angular/core';
import { HttpParams } from '@angular/common/http';
import 'rxjs/add/operator/map'; 

@Injectable
export class MyService {
    constructor(private http: Httpclient) {}

   getData(param1: string, param2: string): Observable<Model>{
   let params = new HttpParams();
   {...}
   return this.http.get<Model>(this.baseUrl, { params })
      .map((data) => new Model());
   }
}

A类作为超类

export ClassA implements OnChanges {
    constructor(private _serviceMethod: (param1: string, param2: string) => Observable<Model>){}

    ngOnChanges() {
        this.getData(somedata, somedata);
    }

    getData(param1?: string, param2?: string) {
        this._serviceMethod(param1, param2)
           .subscribe((response: Model) => {
           this.data = response;
        }, (error) => {
            {...}
        });
     }
}

和ClassBComponent作为子类

@Component({
selector: 'class-b',
templateUrl: 'class-b.component.html',
styleUrls: ['class-b.component.css'],
 })

export ClassBComponent extends ClassA {
      constructor(private myService: MyService){
          super(myService.getData);
     }
}

ClassBComponent是扩展ClassA并在getData(somedata, somedata) ClassA方法中共享某些逻辑的众多组件之一。现在,如果我这样做

this.http.get中的

MyService抛出&#34; TypeError:无法读取属性&#39; get&#39;未定义&#34;。即使在http构造函数中注入,HttClient类型MyService也未定义,因为MyService中的'this'不再获得服务引用并指向ClassBComponent。我如何绑定MyService的实例并在我传递子类super()中的方法时使用它?你知道我怎么能这样做吗?谢谢:))

1 个答案:

答案 0 :(得分:0)

如果一个函数应该用作回调(事件监听器等),它最好应该绑定在类构造上,例如使用bind或箭头功能。

由于getData不应该是一个回调,而是像一个回调一样使用,它应该就地绑定:

export ClassBComponent extends ClassA {
      constructor(private myService: MyService){
          super(myService.getData.bind(myService));
     }
}