Передать параметр в сервисный конструктор
Предположим, у меня есть сервис Angular 2:
@Injectable()
class Demo {
constructor(private instanceSpecificString: string) {
}
}
Обратите внимание, что его constructor
принимает специфичный для экземпляра string
. Под этим я подразумеваю, что я хочу создавать этот сервис несколько раз, и каждый раз, когда он создается, я хочу передать ему другой string
в зависимости от контекста, в котором создается сервис.
Как мне это сделать?
Постскриптум string
используется в качестве примера, но параметр может легко иметь тип number
, boolean
или даже какую-то конфигурацию object
.
Ответы
Ответ 1
Значение, которое передается вашей службе, будет определяться инжектором, который создает его. Возможно, вы сможете сделать это в одном из определений ваших компонентов:
@Component({
...
providers: [
provide(string, {useValue: "someSpecificValue"})
]
})
Однако у этой проблемы есть проблема, что вы определяете поставщика для токена строки, и это может привести к проблемам с ремонтопригодностью.
Вероятно, это лучший шаблон для определения некоторой конфигурации для вашей службы:
class DemoConfig {
instanceSpecificString: string;
}
И затем вы можете создать экземпляр этого, чтобы перейти к вашей службе.
let config = { instanceSpecificString: "someSpecificValue" }
@Component({
...
providers: [
provide(DemoConfig, {useExisting: config})
]
})
Надеюсь, это полезно. Я сам не пробовал; сервисы, которые я использую в своем приложении, - это одиночные. Вот ссылка, которую я использовал:
https://angular.io/docs/ts/latest/api/core/index/provide-function.html
Ответ 2
Поскольку служба объявлена инъекционной (аннотация @Injectable()
), она является одноэлементной. Вместо этого просто удалите аннотацию в верхней части службы, чтобы снять это ограничение.
Это не обязательно лучший метод, но он будет работать и компилироваться с включенным AOT.
Пример:
Изменить эту услугу:
@Injectable()
export class BaseSocket extends Socket {
protected constructor(
private baseConfig:SocketIoConfig
...
) {
super();
}
}
В это:
export class BaseSocket extends Socket {
protected constructor(
private baseConfig:SocketIoConfig
...
) {
super();
}
}