2016-09-01 5 views

ответ

0

Завод принимает функцию.

Декораторы в машинописном тексте могут применяться к: объявлению класса, методу, аксессуару, свойству или параметру.

Другими словами, в настоящее время вы можете украшать только класс и класс.

параметр относится к параметру метода, а не к функции.

Итак, поскольку вы не можете украсить функцию и тем более параметры в функции, вы не можете установить тег @Optional.

Это ограничение языка/спецификации, которое может измениться в будущем.

Следует отметить, что функция метаданных, поддерживаемая машинописными текстами и потребляемая угловым использованием , отражает метаданные, предназначенные для работы над классами. Это, конечно, нонсенс, классы - это функции ... но это общая ментальная модель.

В соответствии с документацией массив deps принимает токены поставщика, что означает, что вы не можете намекать, что зависимость является необязательной.

Это хорошая идея иметь поддержку дополнительных зависимостей на фабриках. Вы должны открыть проблему GH с запросом на функцию!

4

Я нашел такой обходной путь:

class OptionalDepHolder { 
    constructor(@Optional() @Inject(SOME_DEP) public optionalDep) {} 
} 

@NgModule ({ 
    providers: [ 
    { provide: MyService, 
     useFactory: (holder) => new MyService(holder.optionalDep) 
     deps: [OptionalDepHolder] 
    } 
}) 
class MyModule {} 
0

Это действительно возможно объявить дополнительную зависимость для поставщика фабрики.

export const MY_OPTIONAL_SERVICE_PARAMETER = new OpaqueToken('my_optional_service_parameter'); 
export const myOptionalServiceParameterDefault = 42; 

Затем в списке поставщиков, не предоставляют по умолчанию с помощью поставщика значение

@NgModule({ 
    providers: [ 
     { 
      provide: MY_OPTIONAL_SERVICE_PARAMETER, 
      useValue: myOptionalServiceParameterDefault 
     }, 
     { 
      provide: MyService, 
      useFactory: (optionalParam) => new MyService(optionalParam) 
      deps: [MY_OPTIONAL_SERVICE_PARAMETER] 
     } 
}) 
export class Module {} 

Услуга будет использовать унаследованное значение по умолчанию параметра (который может быть undefined), если в потребитель переопределяет значение позже в списке поставщиков.

HttpModule от @angular/http использует этот шаблон для предоставления необязательной зависимости RequestOptions к его услугам.

1

Согласно официальному документу, вы можете сделать следующее:

const Location = new InjectionToken('location'); 
const Hash = new InjectionToken('hash'); 

const injector = Injector.create([{ 
    provide: Hash, 
    useFactory: (location: string) => `Hash for: ${location}`, 
    // use a nested array to define metadata for dependencies. 
    deps: [[new Optional(), Location]] 
}]); 

expect(injector.get(Hash)).toEqual('Hash for: null'); 

См https://angular.io/api/core/FactoryProvider#example для более

Смежные вопросы