Альпийский js. Значение x-text не обновляется при изменении переменной

Я использую Laravel с Alpinejs и webRTC, чтобы проверить, включена ли у пользователя камера или нет. Часть webRTC работает нормально и обнаруживает камеру. Но значение x-text, которое показывает, включена или выключена камера, не обновляется после получения потока webRTC.

<div class = "card">
    <div class = "card-header font-bold">Preparation Page</div>
    <div class = "card-body">
        {!! $exam->bo_exam_instruction !!}
        <div class = "mt-2">
            Camera : <span x-text = "isOpen ? 'On' : 'Off'" class = "badge" :class = "cameraClasses()"></span>
        </div>
        <div>
            <form action = "{{ route('student.startOlympiad', $exam->id) }}" method = "POST"
                x-ref = "examForm">
                @csrf
                <button class = "btn mt-2" :class = "buttonClasses()"
                    x-on:click.prevent = "confirmStartExam()">
                    Start Exam</button>
            </form>
        </div>
    </div>
</div>
@push('extra_js')
    <script>
        function componentData() {
            return {
                isOpen: false,
                cameraClasses() {
                    console.info("isOpen:", this.isOpen);
                    return {
                        // <span class = "badge badge-danger">Danger</span>
                        'badge-danger': !this.isOpen,
                        'badge-success': this.isOpen
                    }
                },
                adapter: {
                    browserDetails: {
                        browser: navigator.userAgent,
                        version: navigator.appVersion
                    }
                },
                buttonClasses() {
                    return {
                        'btn-primary': !this.isOpen,
                        'btn-secondary': this.isOpen
                    };
                },
                confirmStartExam() {
                    if (this.isOpen) {
                        Swal.fire({
                            title: 'Are you sure?',
                            text: 'Once you start the exam, you cannot go back!',
                            icon: 'warning',
                            showCancelButton: true,
                            confirmButtonColor: '#3085d6',
                            cancelButtonColor: '#d33',
                            confirmButtonText: 'Yes, start the exam!'
                        }).then((result) => {
                            if (result.isConfirmed) {
                                this.startExam();
                            }
                        });
                    } else {
                        Swal.fire({
                            title: 'Camera Permission!',
                            text: 'Please allow camera permissions',
                            icon: 'info',
                        })
                    }
                },
                startExam() {
                    // Submit the form using Alpine.js
                    this.$refs.examForm.submit();
                },
            }
        }

        const data = componentData();
        async function openMediaDevices(constraints) {
            try {
                const stream = await navigator.mediaDevices.getUserMedia(constraints);
                // If stream is obtained, set isOpen to true
                if (stream) {
                    console.info(stream); //gets stream
                    data.isOpen = true;
                    console.info(data.isOpen); //comes true
                }
                return stream;
            } catch (error) {
                console.error('Error accessing media devices.', error);
                return null;
            }
        }

        window.onload = async function() {
            await openMediaDevices({
                video: true
            });
            console.info("Final isOpen:", data.isOpen);
        }
    </script>
@endpush

когда data.isOpen = true; x-text="isOpen ? 'On' : 'Off'" должно отображаться «ON». все еще показывает "ВЫКЛ"

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Вы можете использовать событие для связи с вашим компонентом, но почему бы просто не переместить функцию openMediaDevices на сам компонент? Затем вы можете вызвать его из функции init() компонента и изменить значение this.isOpen оттуда:

function componentData() {
  return {
    isOpen: false,
    // ... other properties and methods
    async openMediaDevices(constraints) {
      try {
        const stream = await navigator.mediaDevices.getUserMedia(constraints);
        if (stream) {
          this.isOpen = true;
        }
        return stream;
      } catch (error) {
        console.error('Error accessing media devices.', error);
        return null;
      }
    },
    async init() {
      await this.openMediaDevices({
        video: true,
      });
      console.info('Final isOpen:', this.isOpen);
    },
  };
}

Другие вопросы по теме