Использование 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/
Чтобы увидеть в действии, нажмите «Добавить строку», чтобы получить данные для заполнения раскрывающегося списка.
Был бы признателен за вклад.
@ haim770 это дает мне весь набор элементов. Таблица может содержать несколько строк, поэтому возможен множественный выбор. Вот почему я добавил столбец ID и Name в список, чтобы я мог различать их. Я снова хочу проверить, сделал ли пользователь какой-либо выбор в раскрывающемся списке. Я создал новый jsfiddle с вашими изменениями как: jsfiddle.net/sq8m054L/1
Вам необходимо указать «optionsValue» в атрибуте привязки данных, чтобы Knockout знал, какое свойство нужно привязать к полю «значение» в выбранных вами параметрах. См. knockoutjs.com/documentation/options-binding.html
Не могу иметь optionsValue. Ценность и параметры Ценность несовместимы. Я помню, как использовал его раньше, и у меня были некоторые проблемы.
optionsValue и value действительно работают вместе, я изменил вашу скрипку js, чтобы продемонстрировать, но, как упоминалось ниже, есть более эффективные способы сделать это, перебирая ваши элементы и гарантируя, что selectedValue () не пуст ... jsfiddle.net/7wqvr854/55Что ж, это подтверждает, но дает ошибку JS. Текст не определен. См. Свою скрипку, также она выдает ошибку при добавлении optionsValue



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам не следует обращаться к 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, чтобы я мог выделить точное раскрывающееся меню, в котором не было сделано выбора
Вы можете найти раскрывающиеся списки, которые не соответствуют требованиям, используя filter. Затем вы можете установить флаг invalid для этих строк с помощью forEach над недопустимыми строками.
Меняем на
var selectList = $('#tdName > select > option').get();