4

У меня есть служба, определенная в моем приложении Angular2 (2.0.0-beta.0). Это что-то вроде этого:Угловое обслуживание 2 не вставляется в компонент

import {Injectable} from "angular2/core"; 

@Injectable() 
export class MyService { 
    constructor() { 

    } 

    getSomething() { 
     return 'something'; 
    } 
} 

он у меня в списке в моей начальной загрузки функции() в моем главном файле приложения так, что она должна быть доступна для моего кода в целом:

bootstrap(App, [MyService, SomeOtherService, ROUTER_DIRECTIVES[); 

Иногда я могу «т использовать сервис в качестве компонента, хотя у меня есть что-то вроде myService:MyService в функции компонент constructor(), например:

import {MyService} from '../services/my.service'; 

@Component({ 
    selector: 'my-component', 
    directives: [], 
    providers: [], 
    pipes: [], 
    template: ` 
    <div><button (click)="doStuff()">Click Me!</button></div> 
    ` 
}) 
export MyComponent { 
    constructor(myService:MyService) {} // note the private keyword 

    doStuff() { 
     return this.myService.getSomething(); 
    } 
} 

в других местах он работает отлично. В тех местах, где она не работает, я получаю такое сообщение при попытке доступа к нему:

EXCEPTION: TypeError: Cannot read property 'getSomething' of undefined 

Это в основном означает, что услуга не была введена.

Что вызывает его не впрыскивание?

ответ

6

Проблема заключается в том, что, как представляется, инъекция зависимостей не будет работать, если у вас нет инжектированных объектов в конструкторе, отмеченных как private, так и public.

Добавление любой из этих двух вещей перед инъекцией службы в конструкторе моего компонента заставили его работать нормально:

import {MyService} from '../services/my.service'; 

@Component({ 
    selector: 'my-component', 
    directives: [], 
    providers: [], 
    pipes: [], 
    template: ` 
    <div><button (click)="doStuff()">Click Me!</button></div> 
    ` 
}) 
export MyComponent { 
    constructor(private myService:MyService) {} // note the private keyword 

    doStuff() { 
     return this.myService.getSomething(); 
    } 
} 
+0

Я объявляя их перед конструктором и используя 'this.MyService = MyService', но мне нравится этот метод .. –

+1

У меня есть мое точно так же, как ваша, и я все еще получаю«MyService»не определен ошибка во время выполнения –

+1

Я сделал то, что вы говорите, но все еще не работает, и давая эту ту же ошибку –

11

Такое поведение совершенно нормально.

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

При добавлении частного или общественного ключевого слова, машинопись будет добавить переменную к свойству класса, так что вы можете позже вызвать свойство с это ключевых слов.

constructor(myService: MyService) { 
    alert(myService.getSomething()); 
    // This will works because 'myService', is declared as an argument 
    // of the 'constructor' method. 
} 

doStuff() { 
    return (this.myService.getSomething()); 
    // This will not works because 'myService' variable is a local variable 
    // of the 'constructor' method, so it's not defined here. 
} 
+1

[Документы для машинописных документов] (http: //www.typescriptlang .org/Handbook # classes-privatepublic-modifiers): «Ключевые слова« public »и« private »также дают вам краткое описание для создания и инициализации членов вашего класса путем создания свойств параметров. Свойства позволяют создавать и инициализировать элемент в один шаг ». –

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