Angular 2 внедряет сервис в расширенный класс (BaseRequestOptions)

typescript dependency-injection angular

2977 просмотра

2 ответа

3744 Репутация автора

У меня есть следующий код, который расширяет BaseRequestOptionsкласс:

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

@Injectable()
export class AppRequestOptions extends BaseRequestOptions {
    constructor(private serviceA:ServiceA) {       
        super();        
    }   
    merge(options?: RequestOptionsArgs): RequestOptions {        
        console.log(this.serviceA);
        //this.serviceA.myCustomMethod();
        return super.merge(options);
    }
}

Когда я ссылаюсь this.serviceAна значение undefined. Когда я внедряю тот же сервис в другие сервисы / компоненты, он работает как положено.

Вот полный код начальной загрузки:

import { Injectable } from '@angular/core';
import { bootstrap }    from '@angular/platform-browser-dynamic';
import { AppComponent } from './app.component';
import { APP_ROUTER_PROVIDERS  } from './routes';
import { HTTP_PROVIDERS, BaseRequestOptions, RequestOptions, RequestOptionsArgs, Headers } from '@angular/http';
import { ServiceA } from './ServiceA';

@Injectable()
export class AppRequestOptions extends BaseRequestOptions {
    constructor(private serviceA:ServiceA) {       
        super();        
    }   
    merge(options?: RequestOptionsArgs): RequestOptions {        
        console.log(this.serviceA);
        //this.serviceA.myCustomMethod();
        return super.merge(options);
    }
}

bootstrap(AppComponent, [
    APP_ROUTER_PROVIDERS,
    HTTP_PROVIDERS,  
    ServiceA,
    { provide: RequestOptions, useClass: AppRequestOptions }
]).catch(err => console.error(err));

ServiceA declaretion:

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

@Injectable()
export class ServiceA {
    myCustomMethod() {

    }
}

Я использую Angular версии 2.0.0-rc.4

Я не уверен, что это потому, что я расширяю класс и отмечаю его как @Injectable()?

Я проверил, и единственные связанные вопросы, которые я могу найти, являются:

Внедрить службу в службу внутри службы в моем приложении Angular 2

Angular 2: Внедрить сервис в другой сервис. (Нет ошибки провайдера)

ОБНОВИТЬ

Похоже, это связано с открытой ошибкой: https://github.com/angular/angular/issues/8925

Автор: Tjaart van der Walt Источник Размещён: 18.07.2016 12:24

Ответы (2)


3 плюса

159573 Репутация автора

Решение

Для этого существует открытая ошибка: https://github.com/angular/angular/issues/9758 .

Тогда как метаданные для внедрения зависимостей установлены правильно, элемент не предоставляется экземпляру класса на уровне конструктора.

@Injectable()
export class AppRequestOptions extends BaseRequestOptions {
  constructor(private serviceA:ServiceA) {       
    super();        
    console.log(Reflect.getMetadata('design:paramtypes', AppRequestOptions));
    console.log(Reflect.getMetadata('parameters', AppRequestOptions));
  }

  (...)
}

Смотрите этот plunkr для более подробной информации: https://plnkr.co/edit/hcqAfsI7u88jbjScq6m3?p=preview .

редактировать

Это будет работать, если вы используете RequestOptionsкласс вместо BaseRequestOptionsодного:

@Injectable()
export class AppRequestOptions extends RequestOptions {
  constructor(private serviceA:ServiceA) {       
    super();        
  }   

  (...)
}

Смотрите этот план: https://plnkr.co/edit/laP04kqUCOR5qbFgo0iM?p=preview .

Автор: Thierry Templier Размещён: 18.07.2016 01:09

1 плюс

71 Репутация автора

Это очень похоже на вопрос, на который я ответил здесь: добавленная зависимость не определена при расширении BaseRequestOptions

При определении вашего провайдера также определите необходимые зависимости, поэтому объект в определении вашего провайдера будет выглядеть так:

{
 provide: RequestOptions,
 useClass: AppRequestOptions,
 deps: [ServiceA]
}
Автор: Nate Loftsgard Размещён: 10.01.2017 10:17
Вопросы из категории :
32x32