2016-08-08 3 views
1

Я разрабатываю компонент Angular2, который использует веб-камеру для привязки изображения к элементу холста и извлекает его как Blob. В отдельности Blob и событие работают правильно, но когда я пытаюсь испустить событие из функции обратного вызова toBlob, это событие больше не поднимается для его слушателей.Angular2 EventEmitter не вызывает событие при испускании обратного вызова

Это работает:

var self = this; 

self.gotSnapshot.emit({}); //Raises the gotSnapshot event correctly. 

this.canvas.toBlob(function(blob){ 
    console.log(blob); //Logs the blob to console correctly. 
}); 

Это не:

var self = this; 

this.canvas.toBlob(function(blob){ 
    self.gotSnapshot.emit(blob); //Event is never raised for listeners 
}); 

Я уверен, что это потому, что toBlob выполняется асинхронно. В Angular1 мой инстинкт должен был сделать $ timeout и call apply, но я подумал, что для EventEmitter нам больше не нужно иметь дело со всем этим?

Кто-нибудь знает, как обойти это?

ответ

3

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

constructor(private zone:NgZone){} 

someMethod() { 
    this.canvas.toBlob((blob) => { 
    this.zone.run(() => { 
     this.gotSnapshot.emit(blob); 
    }); 
    }); 
} 

Вам также не нужно self, если вы используете () => вместо function()

+2

Вау, это было быстро! Большое спасибо, что было именно то, что мне нужно. Думаю, пришло время пойти и узнать все об этой «зоне», о которой я слышал. – Martaver

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