2016-11-25 5 views
2

Я хочу создать базовый класс для компонентов, чтобы иметь возможность делать что-то общее в течение жизненного цикла компонентов. Мне также нужен базовый класс для доступа к некоторой службе. Как это сделать? Конечно, я могу использовать синглтон вместо службы, но это было бы не очень угловато, даже если бы не набирать текст, я полагаю, так как синглтоны являются анти-шаблонами. здоровается, DanielInjecting Angular2 Service в базовый класс компонентов

EDIT:

Это то, что в настоящее время работает, но я скорее ожидал, чтобы сделать ConnectionService @Injectable() и ввести его в конструктор RemoteController как говорят Angular2 документы, желательно без необходимость добавить его в список поставщиков дочерних компонентов.

Ребенок Компонент:

@Component(...) 
export class SomeComponent extends RemoteController { 
    sendRequest() { 
     this.request('something'); 
    } 
} 

Базовый класс:

export class RemoteController implements OnInit { 
    public connection: SocketIOClient.Socket; 
    constructor() { 
     this.connection = RemoteService.connect('ws://localhost:8500'); 
    } 
    request(name: string) { 
     this.connection.emit('request', name); 
    } 
    ngOnInit() { 
     ... 
    } 
} 

одноэлементных Решение:

class ConnectionService { 
    private sockets: { [key: string]: SocketIOClient.Socket }; 
    constructor() { 
     debugger; 
     this.sockets = {}; 
    } 
    connect(url: string) { 
     return (url in this.sockets) ? this.sockets[url] : io.connect(url); 
    } 
} 
let RemoteService = new ConnectionService(); 

export { RemoteService }; 

ответ

1

Angular2 поддерживает только инъекции конструктора. Если у вас есть супер класс и класс к югу, и вы хотите, чтобы ввести в супер класс, вы должны добавить параметр конструктора к классу юга и направить его к югу от класса

export class RemoteController implements OnInit { 

    constructor(public connection: SocketIOClient.Socket) { 
     this.connection = RemoteService.connect('ws://localhost:8500'); 
    } 
@Component(...) 
export class SomeComponent extends RemoteController { 
    constructor(connection: SocketIOClient.Socket) { 
     super(connection 
+0

Это было определенно не то, что я хотел услышать. Я также немного прочитал о программной инъекции через ReflectiveInjector, но я не получил его, чтобы работать нормально. Я буду исследовать немного больше, прежде чем принять этот неудовлетворительный ответ (спасибо в любом случае Günter) – Daniel

+0

Вам все равно нужно вводить инжектор приложения, если вы используете 'ReflectveInjector'. Я написал несколько ответов с примером кода. Я бы даже не пытался обойтись, я не думаю, что это будет хорошо. –

+1

важно * не * добавлять «общедоступные», «частные» или «защищенные» в базовые классы конструкторов, иначе вы столкнетесь с конфликтом. Пример правильно не включает их, но я все равно их включал, пока не понял. – vt5491

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