2015-06-30 3 views
3

Я довольно новичок в knockoutjs, поэтому есть очень хорошая возможность, что это существует, и я просто не искал правильную вещь.Как сделать множественный выбор, но не пустой

У меня есть элемент <select>, который может иметь несколько вариантов выбора. При загрузке я хочу, чтобы ничего не было выбрано, но я не хочу запускать проверку у пользователя, прежде чем они что-либо сделают. Я могу запустить проверку, если что-то выбрано и не выбрано, или маленькая кнопка «none», которая опустошает выбранный массив. Это отлично. Моя <select> выглядит следующим образом:

<select multiple data-bind="options: PossibleValues, 
          selectedOptions: SelectedValues, 
          validationCore: SelectedValues"> 
</select> 

Как я уже сказал, если я явно опорожнить SelectedValues, то я получаю мое сообщение проверки на стороне клиента. Если я этого не сделаю, то isValid() вернет true, и я не вижу сообщений.

Итак, как я могу сделать требуемый множественный выбор и выполнить проверку отказа при отправке, если он пуст, но не выделить его как проблему при загрузке?

EDIT

Я пытался упростить мой пример для моего вопроса, но в основном у меня есть ViewModel, которая имеет ребенка ViewModel и что ребенок имеет объект, который является ko.observable() и также является ViewModel. Затем он получает этот дочерний объект, который является ko.observableArray() ViewModels. Этот самый низкий уровень - это то, где я пытаюсь увидеть ошибки проверки (добавление { deep: true } только кричит о том, чтобы быть слишком глубоким). Проблема в том, что самый низкий уровень - назовем его greatgrandchildVM - возвращает true, когда я звоню isValid(), несмотря на то, что он очень явно недействителен. Looping через массив greatgrandchildVM позволяет мне видеть, что errors() имеет в нем значения.

Почему они не пузырятся и бросают isValid() в ложь? Очевидно, я могу взломать цикл for, чтобы перебрать мой массив greatgrandchildVM и сделать это сам, но я предполагаю, что есть способ нокаутировать это, и я слишком новичок, чтобы его еще узнать.

+0

Могут ли вы поставить скрипку вместе? – Luis

ответ

0

Это очень распространенная проблема с элементами выбора.

Задав SelectedValues ​​опустошить сделать это:

SelectedValues.isModified(false); 

Это должно исправить это

+0

Дело в том, что я не хочу, чтобы пустота была пуста 'SelectedValues'. Я хочу, чтобы он знал, что он пуст и не должен быть без него [SelectedValues ​​([]); – ethorn10

0

Попробуйте использовать this syncModified extender.

Propagate вынуждена проверка и сброс

Если иметь сложную структуру данных, использование ko.validation.group с глубоким: правда часто может быть серьезной болью. С другой стороны, сложная структура данных , вероятно, также включает в себя массивы и объекты, которые должны быть подтверждены .

Примечание: Это расширитель, а не правило проверки.

0

Используйте «optionsCaption» связывания

<select multiple data-bind="options: PossibleValues, 
         selectedOptions: SelectedValues, 
         validationCore: SelectedValues, 
         optionsCaption: 'emptyValueText'"> 
</select> 

Это дает добавляет пустое значение, которое отображает emptyValueText, если не выбрано ни одно значение.

Если нет параметровCaption, нокаут просто выбирает первый из вашего PossibleValues, который затем проверяет выбор.

optionsCaption также может быть наблюдаемым или просто пустой строка

Надеется, что это помогает

Смежные вопросы