Я хочу внедрить службу в класс, который не является компонентом .
Например:
Myservice
import {Injectable} from '@angular/core';
@Injectable()
export class myService {
dosomething() {
// implementation
}
}
Мои занятия
import { myService } from './myService'
export class MyClass {
constructor(private myservice:myService) {
}
test() {
this.myservice.dosomething();
}
}
Это решение не работает (я думаю, потому что MyClass
еще не было создано).
Есть ли другой способ использовать службу в классе (не в компоненте)? Или вы сочтете мой дизайн кода неуместным (использовать службу в классе, который не является компонентом)?
Спасибо.
источник
private
нет необходимости, потому чтоinjector
не используется вне конструктора, поэтому нет необходимости хранить ссылку в поле.Это не прямой ответ на вопрос, но если вы читаете эту ТАК по моей причине, это может помочь ...
Допустим, вы используете ng2-translate и действительно хотите, чтобы он был у вашего
User.ts
класса. Вы сразу же думаете, что нужно использовать DI, чтобы вставить его, в конце концов, вы делаете Angular. Но это своего рода чрезмерное обдумывание, вы можете просто передать его в свой конструктор или сделать его общедоступной переменной, которую вы установили из компонента (где вы, вероятно, сделали DI).например:
import { TranslateService } from "ng2-translate"; export class User { public translateService: TranslateService; // will set from components. // a bunch of awesome User methods }
затем из некоторого связанного с пользователем компонента, который внедрил TranslateService
addEmptyUser() { let emptyUser = new User("", ""); emptyUser.translateService = this.translateService; this.users.push(emptyUser); }
Надеюсь, это поможет тем, кто вроде меня собирался писать намного сложнее для поддержки кода, потому что иногда мы слишком умны =]
(ПРИМЕЧАНИЕ: причина, по которой вы можете захотеть установить переменную вместо того, чтобы делать ее частью вашего метода конструктора, заключается в том, что у вас могут быть случаи, когда вам не нужно использовать службу, поэтому всегда требуется передавать ее, что означало бы введение дополнительного импорта / код, который на самом деле никогда не используется)
источник
translateService
get / set, в которомget
вместо исключения NullReference выдается значимая ошибка, если вы забыли его установитьЭто вроде ( очень ) хакерство, но я подумал, что тоже поделюсь своим решением. Обратите внимание, что это будет работать только со службами Singleton (внедренными в корень приложения, а не в компонент!), Поскольку они существуют до тех пор, пока ваше приложение, и их только один экземпляр.
Во-первых, к вашим услугам:
@Injectable() export class MyService { static instance: MyService; constructor() { MyService.instance = this; } doSomething() { console.log("something!"); } }
Тогда в любом классе:
export class MyClass { constructor() { MyService.instance.doSomething(); } }
Это решение хорошо, если вы хотите уменьшить беспорядок в коде и в любом случае не используете службы, отличные от singleton.
источник
locator.service.ts
import {Injector} from "@angular/core"; export class ServiceLocator { static injector: Injector; }
app.module.ts
@NgModule({ ... }) export class AppModule { constructor(private injector: Injector) { ServiceLocator.injector = injector; } }
poney.model.ts
export class Poney { id: number; name: string; color: 'black' | 'white' | 'brown'; service: PoneyService = ServiceLocator.injector.get(PoneyService); // <--- HERE !!! // PoneyService is @injectable and registered in app.module.ts }
источник
injector.get()
работать перемещение вызова в модуль (при условии, что служба без отслеживания состояния позволяет нескольким классам "совместно использовать" один и тот же экземпляр)?Если ваши методы службы являются чистыми функциями, чистый способ решить эту проблему - иметь в службе статические члены.
ваш сервис
import {Injectable} from '@angular/core'; @Injectable() export class myService{ public static dosomething(){ //implementation => doesn't use `this` } }
твой класс
export class MyClass{ test(){ MyService.dosomething(); //no need to inject in constructor } }
источник