Как загрузить данные камеры перед запуском Angular MatBottomSheet

#html #angular #typescript #angular-material

#HTML #angular #typescript #angular-материал

Вопрос:

Я хотел бы встроить сканер qr-кода (https://github.com/zxing-js/ngx-scanner ) в нижний лист в моем приложении Angular. Чтобы получить информацию о камере, я использую в своем компоненте сканирования (нижний лист) следующий код:

 @ViewChild('scanner')
scanner:ZXingScannerComponent;
hasCameras = false;
hasPermission: boolean;
availableDevices: MediaDeviceInfo[];
selectedDevice: MediaDeviceInfo;
ngOnInit() {
this.scanner.camerasFound.subscribe((devices: MediaDeviceInfo[]) => {
  this.hasCameras = true;

  console.log('Devices: ', devices);
  this.availableDevices = devices;

  //select camera if only one is available
  if (this.availableDevices.length <= 1) {
    this.selectedDevice = this.availableDevices[0];
  }
  else {
    //selects the devices's back camera by default
    for (const device of devices) {
      if (/back|rear|environment/gi.test(device.label)) {
        this.scanner.changeDevice(device);
        this.selectedDevice = device;
        break;
      }
    }
  }
  console.log('selected Device: '   this.selectedDevice);
});}
  

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

html моего компонента сканирования (нижний лист):

   <zxing-scanner #scanner class="scanner" start="true" [device]="selectedDevice" (scanSuccess)="handleQrCodeResult($event)"></zxing-scanner>
  

html компонента, который вызывает компонент сканирования:

   scan() {

const scanSheet = this.bottomSheet.open(ScanningComponent, {
  panelClass: 'bottomSheet'
}); }
  

Кто-нибудь уже сталкивался с этой проблемой?

ОБНОВЛЕНИЕ: я решил это, вызвав это.ChangeDetectorRef.DetectChanges(); Это обновляет данные моей камеры и запускает сканер.

Комментарии:

1. Это также помогло бы прикрепить HTML. Для начала, вы пробовали добавлять *ngIf="selectedDevice" к zxing-scanner элементу?

2. Я попробовал это и получил следующую ошибку: ScanningComponent_Host.ngfactory.js ? [sm]: 1 ОШИБКА TypeError: не удается прочитать свойство ‘camerasFound’ неопределенного значения

3. Похоже scanner , что свойство все еще не установлено к моменту вызова this.scanner.camerasFound.subscribe . Вы обязательно инициализировали его на контроллере (вручную или с помощью внедрения зависимостей)? Было бы действительно полезно, если бы вы опубликовали весь компонент целиком.

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

5. Вот почему вы хотели бы добавить *ngIf, чтобы предотвратить его рендеринг, пока вы не передадите ему данные. Проблема, основанная на вашем сообщении об ошибке, this.scanner заключается undefined в том, что .