2015-06-24 3 views
7

Я написал базовое угловое приложение, которое использует класс EventEmitter, однако я не могу заставить компонент прослушивания поймать событие.Не удалось поймать события EventEmitter в Angular2?

Вот мой код (используя альфа.27 на Angular2/TypeScript 1.5 для ES5) Извиняется за подробный пример.

Любые советы о том, что я неправильно делаю, что было бы весьма полезно.

import {Component, View, EventEmitter} from 'angular2/angular2'; 

@Component({ 
    selector: 'login', 
    events : ['loggedIn'] 
}) 

@View({ 
    template: '<button type="button" (click)="submitForm()">Click Me</button>' 
}) 

export class Login { 

    loggedIn = new EventEmitter(); 

    constructor() { 
    } 

    submitForm() { 
     console.log("event fired"); 
     this.loggedIn.next({}); 
    } 

} 


@Component({ 
    selector: 'app' 
}) 

@View({ 
    template: "<div>This is the application</div>" 
}) 

export class App { 
    constructor() { 

    } 
} 

@Component({ 
    selector: 'root' 
}) 

@View({ 
    template: '<app [hidden]=!showApp></app><login (loggedIn)="loggedIn()" [hidden]=showApp></login>', 
    directives: [ App, Login ] 
}) 

export class Root { 

    showApp:boolean; 

    constructor() { 
     this.showApp = false; 
    } 

    loggedIn() { 
     console.log("event caught"); 
     this.showApp = true; 
    } 

} 
+0

try '(^ loggedIn)' – unobf

+0

Спасибо за ваш ответ. Я пробовал: (^ loggedIn) = "loggedIn()" , но это не решило проблему. – DaylightProgrammer

+0

мы можем удалить этот вопрос? это довольно запутанно, потому что ng2 был обновлен, и теперь ни вопрос, ни ответ не обновлены –

ответ

6

Это a working Plunker вашего приложения.

import {Component, View, EventEmitter, bootstrap} from '@angular/core'; 

@Component({ 
    selector: 'login', 
    events : ['update'] 
}) 
@View({ 
    template: '<button type="button" (click)="submitForm()">Login</button>' 
}) 
class Login { 
    constructor() { 
    this.update = new EventEmitter(); 
    } 
    submitForm() { 
    this.update.next(); 
    } 
} 


@Component({ 
    selector: 'app' 
}) 
@View({ 
    template: "<div>This is the application</div>" 
}) 
class App {} 

@Component({ 
selector: 'root' 
}) 
@View({ 
    template: ` 
    <app [hidden]="!showApp"></app> 
    <login (update)="loggedIn()" 
    [hidden]="showApp"></login> 
    `, 
    directives: [App, Login] 
}) 
class Root { 
    showApp:boolean; 
    constructor() { 
     this.showApp = false; 
    } 
    loggedIn() { 
     this.showApp = true; 
    } 
} 

bootstrap(Root); 

Я думаю, что было несколько проблем. (update) в шаблоне - это тип события, поэтому его нельзя назвать loggedIn. Мне было проще просто вызвать событие update вообще.

+0

Спасибо! Оцените рабочий пример. – DaylightProgrammer

0

Вы видели это example? Виктор Савкин использует почти все то же самое, как вы, но без пустого объекта в этой строке:

this.complete.next(); 

На AngularU, Мисько показал пример с EventEmitter: https://angularu.com/VideoSession/2015sf/angular-2-roadmap-update начиная с 41:00

+0

Если я не пройду без аргументов, я получаю следующую ошибку компилятора: ошибка TS2346: Поставляемые параметры не соответствуют какой-либо сигнатуре целевого вызова , – DaylightProgrammer

+0

Это не действует, вы можете передать объект или просто вызвать Event Emitter. – shmck

3

В шаблон класса Root, вы должны пройти $ событие в вызов LoggedIn: переменная событие

(loggedIn) = "loggedIn($event)" 

в $ представляет собой объект, который вы передаете в следующем методе вашего LoggedIn эмиттера в Вход классе. Конечно, ваш метод loggedIn вашего класса Root также должен принимать объект в качестве аргумента.

+0

Кроме того, в коде позади Root вы должны объявить: loggedIn (obj) { console.log ("event caught"); this.showApp = true; } – jpsfs

+0

Это фактически не имеет никакого эффекта. Проблема связана с '(event)' с левой стороны, которая называется '(loggedIn)', когда тип события '' (update) '. – shmck

4

Я просто боролся с этой проблемой.

Причина, по которой она не работает, связана с случаем имени события. Если бы это было названо loggedin, а не loggedIn, это было бы хорошо.

+1

Я только что нашел, что если вы хотите использовать имена смешанных флагов для своих пользовательских событий, вы можете использовать 'loggedIn' для имен переменных и 'logged-in' для имени события в HTML.как это ... (logged-in) = "обработчик()" –

1

В моем случае я забыл украсить элемент класса @Output(), например.

@Output() close: EventEmitter<DialogResult> = new EventEmitter<DialogResult>(); 
Смежные вопросы