Javascript поиск раскрывающегося списка внутри knockout data-bind foreach

Использование knockout js

Я настроил раскрывающийся список внутри таблицы как:

 <tbody data-bind = "foreach: items">
<tr>
  <td id = "tdName"><select class = "form-control" data-bind = "options: $parent.ddl, optionsText: 'firstName', value: selectedValue, optionsCaption: '--Select--',  attr: { name: 'Items[' + $index() + '].Name', id: 'Items[' + $index() + '].Name'}"> </select></td>
 </tr>

Таким образом, он создает несколько строк раскрывающихся списков. Вышеупомянутое в html выглядит так:

<select class = "form-control" data-bind = "options: $parent.ddl, optionsText: 'firstName', value: selectedValue, optionsCaption: '--Select--',  attr: { name: 'Items[' + $index() + '].Name', id: 'Items[' + $index() + '].Name'}" name = "Items[0].Name" id = "Items[0].Name"><option value = "">--Select--</option><option value = "">Alex</option><option value = "">Sam</option> </select>

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

Поэтому я пытаюсь использовать приведенный ниже код при нажатии кнопки сохранения:

     var selectList = $('#tdName > select');         
        for (var ddl of selectList ) {               
            if (ddl.value == '') {
                ddl.className = "required text-danger form-control ddl-error";                }
        }

В моей консоли при отладке я вижу список selectList как: select # Items [0] .Name.form-control

Итак, в основном то, что я пытаюсь сделать выше, - это перебрать весь ddl, и, если выбор не сделан, добавьте к нему класс ошибки, чтобы он был выделен.

Проблема в том, что ddl.value всегда '', поэтому раскрывающийся список всегда выделяется.

Не уверен, что здесь я зацикливаюсь, хотя правильно здесь

У меня здесь jsfiddle:

https://jsfiddle.net/aman1981/7wqvr854/51/

Чтобы увидеть в действии, нажмите «Добавить строку», чтобы получить данные для заполнения раскрывающегося списка.

Был бы признателен за вклад.

Меняем на var selectList = $('#tdName > select > option').get();

haim770 22.03.2018 15:03

@ haim770 это дает мне весь набор элементов. Таблица может содержать несколько строк, поэтому возможен множественный выбор. Вот почему я добавил столбец ID и Name в список, чтобы я мог различать их. Я снова хочу проверить, сделал ли пользователь какой-либо выбор в раскрывающемся списке. Я создал новый jsfiddle с вашими изменениями как: jsfiddle.net/sq8m054L/1

kaka1234 22.03.2018 15:20

Вам необходимо указать «optionsValue» в атрибуте привязки данных, чтобы Knockout знал, какое свойство нужно привязать к полю «значение» в выбранных вами параметрах. См. knockoutjs.com/documentation/options-binding.html

83N 22.03.2018 16:47

Не могу иметь optionsValue. Ценность и параметры Ценность несовместимы. Я помню, как использовал его раньше, и у меня были некоторые проблемы.

kaka1234 22.03.2018 16:54
optionsValue и value действительно работают вместе, я изменил вашу скрипку js, чтобы продемонстрировать, но, как упоминалось ниже, есть более эффективные способы сделать это, перебирая ваши элементы и гарантируя, что selectedValue () не пуст ... jsfiddle.net/7wqvr854/55
83N 22.03.2018 16:56

Что ж, это подтверждает, но дает ошибку JS. Текст не определен. См. Свою скрипку, также она выдает ошибку при добавлении optionsValue

kaka1234 22.03.2018 18:15
Поведение ключевого слова "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
6
423
1

Ответы 1

Вам не следует обращаться к DOM для проверки выбранных значений. Вы уже привязываете их к своей модели просмотра!

Проверка достоверности внутри метода Save может напрямую обращаться к items:

self.save = function() {
  var rows = self.items();

  if (!rows.length)
    alert("You cannot save an empty table");
  else if (!rows.every(r => r.selectedSeperator()) 
    alert("Some rows do not have a selected seperator");
  // etc.

};

Это работает для выбранного разделителя, но не для моего первого раскрывающегося списка. В первый раз, если добавляется пустая строка и нажимается кнопка сохранения, элементы имеют длину, равную единице, поэтому проверка не выполняется. Во-вторых, если вы добавите одну строку и выберите все значения в этом раскрывающемся списке. Затем добавьте еще одну строку, количество элементов снова равно 2, поэтому она также не проверяется здесь. Я хотел получить доступ к DOM, чтобы я мог выделить точное раскрывающееся меню, в котором не было сделано выбора

kaka1234 22.03.2018 18:11

Вы можете найти раскрывающиеся списки, которые не соответствуют требованиям, используя filter. Затем вы можете установить флаг invalid для этих строк с помощью forEach над недопустимыми строками.

user3297291 22.03.2018 18:28

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