Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Angular2+: Почему нельзя обойтись без dependency injection? (https://javascript.ru/forum/angular/69912-angular2-pochemu-nelzya-obojjtis-bez-dependency-injection.html)

Shitbox2 27.07.2017 12:02

Если вернуться к сути.
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Component({
  selector: 'app',
  templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
  getData(){
    return new HttpClient().get('/url');
  }

Не работает, потому что new HttpClient() требует httpHandler в конструктор. Что угодно туда не подсунешь, потому что должен быть тип httpHandler, класс которого запрятан внутри Ангуляра. Как заставить это работать и почему это работает, если использовать HttpClient стандартно через this компонента?

destus 27.07.2017 14:19

Цитата:

класс которого запрятан внутри Ангуляра
Не понимаю о чем вы. Это же Open Source. Никто никуда ничего не прятал. А всё дело в том, что HttpHandler это некий абстрактный класс (а создавать напрямую объекты абстрактного класса нельзя) с абстрактным методом handle. И этот самый метод реализуется в унаследованном классе - HttpXhrBackend

Цитата:

Как заставить это работать
import {HttpClient,  HttpXhrBackend, XhrFactory} from '@angular/common/http';

class BrowserXhr implements XhrFactory {
  constructor() {}
  build(): any { return <any>(new XMLHttpRequest()); }
}

@Component({
  selector: 'app',
  templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
  getData(){
    return new HttpClient(new HttpXhrBackend(new BrowserXhr())).get('/url').subscribe();
  }

https://plnkr.co/edit/ifwNLrlNUu2s39Dfqk70?p=preview
Цитата:

и почему это работает, если использовать HttpClient стандартно через this компонента?
Ну очевидно же, что разработчики ангуляра сделали всё за вас.

Shitbox2 27.07.2017 14:53

Спасибо! Стало понятнее. Усложнение, конечно ппц какое.

Что же это получается, если я захочу, например, реализовать ресурсный класс как в первом Ангуляре, то мне придется использовать всю эту свистопляску
export class Resource {

  private http

  constructor(
     private url: string
  ) {
    this.http = new HttpClient(new HttpXhrBackend(new BrowserXhr()));
  }

  get() {
    return this.http.get(this.url).subscribe()
  }
 }


Делать так
constructor(
     private url: string,
     private http: HttpClient
  ) {

я конечно не смогу, потому что new Resource(url) будет требовать httpClient вторым параметром

P.S. Странно, что в TS делается implements от абстрактного класса


Часовой пояс GMT +3, время: 10:55.