Как получить const из метода forEach в javascript?

У меня есть приложение django с моделью викторины:

class Quiz(models.Model):
    name                    =   models.CharField(max_length=50)
    topic                   =   models.CharField(choices=TOPICS, max_length=50)
    number_of_questions     =   models.IntegerField(validators=[MinValueValidator(1)])
    time                    =   models.IntegerField(help_text="duration of quiz in minutes", default=5)
    pass_score              =   models.IntegerField(help_text="score required to pass in %", default=90, validators = [MaxValueValidator(100), MinValueValidator(0)])
    difficulty              =   models.CharField(choices=DIFFICULTY_CHOICES, max_length=10)

Я получаю его в виде:

def quiz_view(request, pk):
    quiz = models.Quiz.objects.get(pk=pk)
    return render(request, 'quizes/quiz.html', {'obj':quiz})

Затем я получаю данные obj в html:

{% for obj in object_list %}
        <button class="modal-button" data-pk="{{ obj.pk }}" data-name="{{ obj.name }}" data-topic="{{ obj.topic }}" data-questions="{{ obj.number_of_questions }}" data-difficulty="{{ obj.difficulty }}" data-time="{{ obj.time }}" data-pass="{{ obj.pass_score }}">
            {{ obj.name }}
        </button>
{% endfor %}
    



<div id="modal"></div>

Затем я получаю данные из кнопки в методе javascript forEach:

let modal = document.getElementById('modal')
const modalBtns = [...document.getElementsByClassName('modal-button')]
modalBtns.forEach(modalBtn => modalBtn.addEventListener('click', ()=>{
        const pk = modalBtn.getAttribute('data-pk')
        const name = modalBtn.getAttribute('data-name')
        const topic = modalBtn.getAttribute('data-topic')
        const numQuestions = modalBtn.getAttribute('data-questions')
        const difficulty = modalBtn.getAttribute('data-difficulty')
        const passScore = modalBtn.getAttribute('data-pass')
        const time = modalBtn.getAttribute('data-time')
        if(modal.classList.contains('close-modal')){
            modal.classList.remove('close-modal')
        }
        modal.classList.add('open-modal')
        modal.innerHTML = `
            <p class="text">Are you sure you want to open</p><p class="name_of_quiz"><b>${name}?</b></p>
            <ul class="description">
                <li>Topic: ${topic}</li>
                <li>Questions: ${numQuestions}</li>
                <li>Difficulty: ${difficulty}</li>
                <li>Score to pass: ${passScore}%</li>
                <li>Time to solve: ${time} min</li>
            </ul>
            <div class="buttons-container">
                <button class="close-button" onclick="close_modal()">Close</button>
                <button class="proceed-button" id='start_button' onclick="startQuiz()">Yes</button>
            </div>
        `
    }))

Когда пользователь нажимает на кнопку, она устанавливает открытый модал:

.open-modal{
        visibility: visible !important;
    }

И мы можем это увидеть. Затем, когда я нажимаю 'proceed-button', я должен получить pk, выполнив startQuiz():

function startQuiz(){
        console.log(pk)
    }

Но я получаю ошибку: `'pk' не определен'.

Могу ли я как-то получить pk из метода forEach?

я нашел вашу проблему. Вы не можете использовать const. Константы имеют область видимости блока. Вместо них используйте параметры. Фрагмент вашего javascript может быть таким:

let modal = document.getElementById('modal')
const modalBtns = [...document.getElementsByClassName('modal-button')]
modalBtns.forEach(modalBtn => modalBtn.addEventListener('click', ()=>{
    const pk = modalBtn.getAttribute('data-pk')
    const name = modalBtn.getAttribute('data-name')
    const topic = modalBtn.getAttribute('data-topic')
    const numQuestions = modalBtn.getAttribute('data-questions')
    const difficulty = modalBtn.getAttribute('data-difficulty')
    const passScore = modalBtn.getAttribute('data-pass')
    const time = modalBtn.getAttribute('data-time')
    if(modal.classList.contains('close-modal')){
        modal.classList.remove('close-modal')
    }
    modal.classList.add('open-modal')
    modal.innerHTML = `
        <p class="text">Are you sure you want to open</p><p class="name_of_quiz"><b>${name}?</b></p>
        <ul class="description">
            <li>Topic: ${topic}</li>
            <li>Questions: ${numQuestions}</li>
            <li>Difficulty: ${difficulty}</li>
            <li>Score to pass: ${passScore}%</li>
            <li>Time to solve: ${time} min</li>
        </ul>
        <div class="buttons-container">
            <button class="close-button" onclick="close_modal()">Close</button>
            <button class="proceed-button" id='start_button' onclick="startQuiz(${pk})">Yes</button>
        </div>
    `
}))
function startQuiz(pk){
    console.log(pk)
}

С некоторыми типами значений может случиться так, что он не работает должным образом. Если он не работает, напишите комментарий с типом pk.

Вернуться на верх