Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 27.07.2017, 10:22
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 520

Цитата:
Angular-cli решает проблему
Появление хелперов и тем более консольных утилит - первый признак несостоятельности фреймворка
Ответить с цитированием
  #12 (permalink)  
Старый 27.07.2017, 12:02
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 520

Если вернуться к сути.
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 компонента?
Ответить с цитированием
  #13 (permalink)  
Старый 27.07.2017, 14:19
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 867

Цитата:
класс которого запрятан внутри Ангуляра
Не понимаю о чем вы. Это же 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 компонента?
Ну очевидно же, что разработчики ангуляра сделали всё за вас.
Ответить с цитированием
  #14 (permalink)  
Старый 27.07.2017, 14:53
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 520

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

Что же это получается, если я захочу, например, реализовать ресурсный класс как в первом Ангуляре, то мне придется использовать всю эту свистопляску
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 от абстрактного класса

Последний раз редактировалось Shitbox2, 27.07.2017 в 15:35.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему можно использовать id элемента без использования getElementById? grifangel Общие вопросы Javascript 3 08.01.2014 20:20
можно ли обойтись без логического оператора НЕ macdack Общие вопросы Javascript 7 12.06.2013 20:16
Клик срабатывает без щелчка на кнопке - почему?.. deivan Events/DOM/Window 3 13.08.2012 13:42
почему нельзя объявить переменную и в ней использовать совмещенные операторы?!! alexben Общие вопросы Javascript 23 12.02.2012 23:32
Обойтись без <body onload=""> LRCenter Events/DOM/Window 3 06.02.2012 21:37