2016-01-15 1 views
0

У меня есть компонент корневого приложения, который определен как шаблон шаблона.`Ошибка: вывод не определен` при передаче значения вне директивы родительской директивы

template: ` 
<dev-table (complete)="onSelect(developer)"></dev-table> 
<dev-details [selectedDeveloper]="selectedDeveloper"></dev-details> 
` 
directives: [DevDetailsComponent, DevTableComponent], 
providers: [DevValueService, provide(DevService, {useClass: DevService})] 

представляет собой список, и по выбору одного из внутреннего списка он должен послать значение списка (разработчик), который передается в качестве выбранного разработчика. @Input определен правильно и берется правильно. Но @output дает ошибку Error: Output is not defined Какое определение необходимо или что такое метод определения. Я чего-то не хватает.

Это определение класса:

@Component({ 
    selector: 'dev-table', 
    template: ` 
    <ul class="dev"> 
     <li *ngFor="#developer of developers" 
     [class.selected]="developer === selectedDeveloper;this.complete.next();" 
     (click)="onSelect(developer)"> 
     <span class="spanbackground">{{developer.name}}</span> - {{developer.skill}} 
     </li> 
    </ul> 
    `, 
    providers: [DevService] 
}) 

export class DevTableComponent implements OnInit{ 
    public developers : Developer[]; 
    public selectedDeveloper : Developer; 
    constructor(private _DevService: DevService) { } 
    @Output() complete = new EventEmitter(); 
    public onSelect(developer: Developer) { this.selectedDeveloper = developer; } 
    getDevelopers(){ 
     this._DevService.getDevelopers().then(developers => this.developers = developers) 
    } 
    ngOnInit(){ 
     this.getDevelopers(); 
    } 
} 

ОБНОВЛЕНО: Окончательный рабочий код не имел developer === selectedDeveloper;this.complete.next();, а this.complete.next() был введен в onSelect функции.

+2

Вы добавили это? 'import {Output} из" angular2/core ";' – Langley

+0

Спасибо. Я сделал это, и я получаю 'Binding выражение не может содержать цепное выражение в столбце 33 в [developer === selectedDeveloper; this.complete.next();] в DevTableComponent @ 3: 8'. То, что я технически делаю, передает значение разработчика родительскому компоненту. а затем передавая его как вход в .dev-детали работают правильно изолированы. Но не удалось захватить событие, отправленное со значением. – Gary

+1

Вы не можете добавить много кода в шаблон, вы должны добавить всю эту логику в функцию, которая возвращает логическое значение и вызывает его следующим образом: '[class.selected] =" shouldSelect() "' – Langley

ответ

2

Если вы хотите передать значение родительскому компоненту, вы можете использовать пользовательское событие. Этот код находится в шаблоне родительского компонента:

@Component({ 
    (...) 
    template: ` 
    <dev-table (complete)="someMethod($event.value)"></dev-table> 
    ` 
}) 
export class ParentComponent { 
    someMethod(value) { 
    console.log('complete event - value = ' + value); 
    } 
} 

Чтобы вызвать событие, вы могли бы сделать что-то подобное в вашем ребенка компонент:

@Component({ 
    (...) 
    template: ` 
    (...) 
    <span (click)="triggerCompleteEvent()">Trigger complete event</span> 
    ` 
}) 
export class DevTableComponent implements OnInit{ 
    @Output() 
    complete:EventEmitter; 

    constructor() { 
    this.complete = new EventEmitter(); 
    } 

    triggerCompleteEvent() { 
    this.complete.emit(someValue); 
    } 
} 

someValue соответствует значению вы хотите, события и подписчики событий могут получить.

Надеется, что это помогает вам, Тьерри

+0

Является ли эта функция полностью предполагаемой в родительской директиве или фактической директиве. $ event.value - некоторое значение в моем списке в директиве. – Gary

+0

Заданное значение и событие запускается вправо. Но родитель приходит неопределенно. '

  • ​​{{developer.name}} - {{разработчик.skill}}
'и класс имеет' onSelect (разработчик: Developer) { this.selectedDeveloper = разработчик; console.log (this.selectedDeveloper); this.complete.emit (this.selectedDeveloper); } '. В родительском '' – Gary

+0

Безопасное прохождение данных сейчас. Благодарю. – Gary

2

«@output дает ошибку об ошибке.. Выход не определен Какое определение требуется или что метод определения я что-то не хватаю» :

import {Output} from "angular2/core";

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

+0

Все работает, и код работает сейчас. Я определил событие в дочерней директиве. Данные фиксируются при нажатии (console.log отлично работает). Я могу правильно передавать события из директивы - никаких ошибок не генерируется. используя 'this.complete.emit (someValue);' но я не могу зафиксировать событие в родительском компоненте '' Он дает $ event .value как неопределенный в родительском. Есть ли процесс захвата, который отличается? – Gary

+1

просто '$ event' не' $ event.value' – Langley

+0

console.log не определено. – Gary

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