AVIL13
@AVIL13

Angular2 — присваивание в конструкторе в TypeScript как это работает?

Доброго времени суток.
Может ли кто то объяснить как правильно записать эти строки не передавая их в параметры конструктора?

import { Router } from '@angular/router';
import { Injectable } from '@angular/core';

@Injectable()
export class ApiService {
    constructor(private router: Router) { }

    get(){
        this.router.navigate(['/test']);
    }
}


Пробовал переписать конструктор вот так, что бы не передавать Http в классе использующем этот сервис.
Получаю ошибку и не могу понять как это нужно записать правильно:

private router: Http;

constructor() {
    this.router = new Router();
}


Как нужно переписать конструктор и как передавать параметр в него при таком же раскладе?

Для примера где можно показать, как нужно делать правильно даю вот этот исходник.
В нем интересно только два файла:
app/route.click.ts - в нем есть метод go() по которому переходим на первую страницу
app/layout/layout.component.ts - он наследуется от вышеприведенного класса, и в нем нужно вызвать родительский метод go().

Как заинжектить зависимости из app/route.click.ts без заноса их в параметры конструктора?

Заранее спасибо.

upd:
Поменял в этом примере Http на Router что бы пример был более детальным
  • Вопрос задан
  • 1180 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
private _http: Http;

constructor(http: Http) {
    this._http = http;
}


Подход - Inversion of Control и Dependency Injection как реализация подхода

Как работает ассайн пропертей из конструктора и почему так делать удобнее: https://www.stevefenton.co.uk/2013/04/stop-manuall...
Ответ написан
Зачем вам инжектить именно в метод? В этом есть какой-то смысл?
Я думаю то что вы хотите можно сделать вот так take.ms/Jt2pn. Нужно использовать this.inject, а появляется этот инжектор в классе из-за декоратора @Injectable() (@Directive и @Pipe наследуют от @Injectable). Когда вы инжектите в конструктор неявно происходит вот это, очень приблизительно:
@Injectable()
export class ApiService {
    private _http: Http
    constructor() {
        this.injector = ReflectiveInjector.resolveAndCreate([Http]); // автоматически разрешает зависимости и заменяет new Http()
        this._http = this.injector.get(Http) // получаем синглтон в пределах инжектора https://angular.io/docs/ts/latest/guide/hierarchical-dependency-injection.html
    }
}

А как ангуляр понимает, что это не просто параметр, а di? В инжекторе есть map в которой регистрируются зависимости, ключами являются типы внедряемых классов, в данном случае Http.

В официально документации все это написано, понятно даже с гугл переводчиком.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы