Angular имеет различные крючки жизненного цикла. NgOnInit является одним из них. Перемещение вашего кода из конструктора в ngOnInit решит проблему.
Angular bootstrap процесс имеет два механизма: 1) построение дерева компонентов 2) обнаружение изменений
Конструктором компонента является Вызывается, когда Angular создает дерево компонентов. Все хуки жизненного цикла, включая ngOnInit, вызываются как часть следующей фазы обнаружения изменений. Обычно для логики инициализации компонента c требуются либо некоторые поставщики DI, либо доступные привязки ввода, либо визуализированный DOM. И они доступны на разных этапах процесса Angular bootstrap.
Конструктор вызывается для инициализации класса, а не компонента. Конструктор вызывается до ngOnInit, на данный момент компонент еще не создан, создается только экземпляр класса компонента, таким образом, вводятся ваши зависимости, но код инициализации не будет выполняться.
Таким образом, конструктор может использоваться для инициализации членов класса, но не должен иметь лог c.
public devices = [];
constructor(...){}
ngOnInit(){
navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
navigator.mediaDevices.enumerateDevices().then(p => this.devices = this.gotDevices(p));
});
}
public gotDevices(deviceInfos){...}