2015-11-06 10 views
33

Mam prosty komponent Angular 2 z @Input, który łączę z szablonem. Szablon pokazuje dane wejściowe, ale nie można uzyskać do niego dostęp z konstruktora:Nie można uzyskać dostępu do danych wejściowych z mojego kontrolera/konstruktora.

import {Component, View, bootstrap, Input} from 'angular2/angular2'; 
import DataService from './data-service'; 

@Component({ 
    selector: 'app-cmp' 
}) 
@View({ 
    template: `{{data.firstName}} {{data.lastName}}` //-> shows the correct 'data' 
}) 
export default class NamesComponent { 
    @Input() data: any; 
    constructor(dataService: DataService) { 
    console.log(this.data);//undefined 
    } 
} 

Oto plunker na przykładzie (patrz „nazwy-component.ts”).

Co robię źle?

Odpowiedz

76

Ponieważ właściwość Input nie została zainicjowana, dopóki widok nie zostanie skonfigurowany. Zgodnie z docs, masz dostęp do swoich danych w metodzie ngOnInit.

import {Component, bootstrap, Input, OnInit} from '@angular/core'; 
import DataService from './data-service'; 

@Component({ 
    selector: 'app-cmp', 
    template: `{{data.firstName}} {{data.lastName}} {{name}}` 
}) 
export default class NamesComponent implements OnInit { 
    @Input() data; 
    name: string; 
    constructor(dataService: DataService) { 
    this.name = dataService.concatNames("a", "b"); 
    console.log(this.data); // undefined here 
    } 
    ngOnInit() { 
    console.log(this.data); // object here 
    } 
} 
+0

podstawie nowszych API, to rzeczywiście trzeba importować OnInit z „angular2/angular2”, a następnie zmienić klasę wdrożyć OnInit tak to powinno wyglądać: eksport domyślna klasa NamesComponent realizuje OnInit { . .. } – jgo

+0

Ta odpowiedź nadal działa z wersją 2.0.0-beta.8. Tak więc można zainicjować usługę w konstruktorze (konstruktorze (dataService: DataService) {this.dataService = dataservice}). Ale rzeczywiste pobranie usługi przy użyciu danych wejściowych jako argumentu musi nastąpić w ramach funkcji ngOnInit() (używając czegoś takiego jak ngOnInit() {var data = this.dataService; this.dataService.getData (data) .subscribe .. . –