2015-05-14 12 views
8

I einfache Starter App erschaffe mit Winkel 2 zu spielen, und ich versuche, einen To-do-Dienst zu machen und ihn zu meiner Komponente zu injizieren und ich bekomme diese Fehlermeldung:Angular 2 Kein Anbieterfehler

Keinen Anbieter für TodoService ! (TodoList -> TodoService)

TodoService.ts

export class TodoService { 
todos: Array<Object> 
constructor() { 
    this.todos = []; 
} 
} 

app.ts

/// <reference path="typings/angular2/angular2.d.ts" /> 

import {Component, View, bootstrap, For, If} from 'angular2/angular2'; 
import {TodoService} from './TodoService' 

@Component({ 
    selector: 'my-app' 
}) 

@View({ 
    templateUrl: 'app.html', 
    directives: [For, If], 
    injectables: [TodoService] 
}) 

class TodoList { 
todos: Array<Object> 
    constructor(t: TodoService) { 
    this.todos = t.todos 
    } 

    addTodo(todo) { 
    this.todos.push({ 
     done:false, 
     todo: todo.value 
    }); 
    } 
} 

bootstrap(TodoList); 

Was ist das Problem?

Antwort

5

Die injizierbaren auf der @Component nicht auf dem @View

angegeben Sie haben:

@Component({ 
    selector: 'my-app' 
}) 

@View({ 
    templateUrl: 'app.html', 
    directives: [For, If], 
    injectables: [TodoService] // moving this line 
}) 

Ändern Sie es an:

@Component({ 
    selector: 'my-app', 
    injectables: [TodoService] // to here 
}) 

@View({ 
    templateUrl: 'app.html', 
    directives: [For, If] 
}) 

Dieser DI es abholen können und injizieren es in Ihre Komponente.

+0

Dank dafür. Ich mache genau das Gleiche. Meine App stürzt jedoch bei der Zeile "injectables:" ab. Da der TodoService nicht geladen wurde, lädt er später .. Wenn ich es in der gleichen Datei deklariere, ist es in Ordnung, aber wenn es in einer separaten Datei ist, kommt es später. Wie kann ich das vermeiden? – Baconbeastnz

+0

Sie können wahrscheinlich @InjectPromise im Konstruktor verwenden; siehe angular2.src.di.annotations_impl –

+5

Überprüfen Sie diese Antwort auf neuere eckige http://StackOverflow.com/questions/30580083/angular2-no-provider-for-nameservice – Peter

1

In der neuesten abgewinkelte Ausführung, müssen Sie Anbieter anstelle von injizierbaren, zB:

@Component({ 
    selector: 'my-app', 
    providers: [TodoService] 
})