2016-07-18 3 views
1

У меня есть @Output типа EventEmitter<any> в компоненте. Выход работает, если я вызываю .emit() на нем в функции после нажатия кнопки. Я могу поймать событие в родительском компоненте в этом случае без проблем. Однако это действительно так же, как тестовая мера. Когда я пытаюсь сделать то, что я действительно хочу сделать, что делает вызов базы данных, а затем испускает событие с успехом, событие никогда не испускается из дочернего компонента или не попадает в родительский компонент. Вот немного кода, чтобы показать, что я имею в виду:Угловой 2 EventEmitter Issue

testOutput() { 
    this.outputEvent.emit({event: 'buttonClick', message: 'Here is some output'}); 
} 

makeAnUpdate(form) { 
    this._service.makeDbCall(data).subscribe(result => { 
     this.variable = result; 
     this.outputEvent.emit({ message: 'Here is a message to pass', success: true }); 
    }); 
} 

Я также пытался вызвать функцию, которая просто излучает событие внутри подписываться части ниже функции, и она по-прежнему не работает:

makeAnUpdate(form) { 
    this._service.makeDbCall(data).subscribe(result => { 
     this.variable = result; 
     this.testOutput(); 
    }); 
} 

У кого-нибудь еще была эта проблема? Опять же, функция testOutput выше работает, если вы ее вызываете и только она, но не внутри функции makeAnUpdate.

+1

Трудно узнать, не видя, что это такое. This._service.makeDbCall (data) 'делает. Я предполагаю, что обратный вызов, переданный 'subscribe (...)', не вызван. –

+0

Это вызов. Вызов выполняется в базу данных и возвращается к этой функции. Я точно знаю, потому что, если я делаю 'console.log' прямо перед эмитентом события внутри,' console.log' работает и появляется. – pjlamb12

+0

Я предполагаю, что исполнение каким-то образом уходит из зоны углов. Я добавлю ответ. –

ответ

1

Обратный вызов наблюдаемого, возвращаемого с makeDbCall, может работать вне зоны углов. Пожалуйста, попробуйте

class MyComponent { 
    constructor(private zone:NgZone) {} 
    makeAnUpdate(form) { 
    this._service.makeDbCall(data).subscribe(result => { 
     this.zone.run(() => { 
      this.variable = result; 
      this.outputEvent.emit({ message: 'Here is a message to pass', success: true }); 
     }); 
    }); 
    } 
} 
+0

Это имеет такой же эффект, что и без 'ngZone.run'. Выводится «console.log», данные возвращаются из базы данных и т. Д., Но событие не выдается. – pjlamb12

+0

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

+0

[Вот суть] (https://gist.github.com/pjlamb12/c3f6633008093eb268fd5b2f618c0934) с примерами файлов, которые настроены так же, как и реальные. Это очень просто; Я не знаю, какую другую информацию я мог бы предоставить. – pjlamb12

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