Angular Как связать экземпляр службы и сохранить его в разных классах - PullRequest
0 голосов
/ 30 мая 2018

Как я могу передать метод обслуживания в суперклассе из подкласса?У меня есть следующий сервис

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 in MyService, выведите "TypeError: Невозможно прочитать свойство 'get' of undefined".Мой http типа HttClient не определен, даже если он внедрен в конструктор MyService, поскольку 'this' в MyService больше не получает ссылку на службу и указывает на ClassBComponent.Как я могу связать экземпляр MyService и использовать его, когда я передаю методы в super() подклассов?У вас есть идеи, как я могу это сделать?Спасибо:)

1 Ответ

0 голосов
/ 30 мая 2018

Если предполагается, что функция используется в качестве обратного вызова (прослушиватель событий и т. Д.), Ее предпочтительно следует привязать к построению класса, например, с помощью bind или функции стрелки.

Так как getDataне должен быть обратным вызовом, но используется как один, он должен быть привязан на месте:

export ClassBComponent extends ClassA {
      constructor(private myService: MyService){
          super(myService.getData.bind(myService));
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...