2013-09-27 2 views
0

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

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

модель (без проверки, потому что я ничего, что работает пока не найдено):

var SearchForm = function(collections) { 

    // main search fields 
    this.fullRecord = ko.observable(); 
    this.title = ko.observable(); 
    this.author = ko.observable(); 

    // collections to search 
    var sources = []; 
    $.each(collections, function(index,collection) { 
     sources.push(new Source(collection)); 
    }); 

    this.sources = ko.observableArray(sources); 

    // Error handling vars 
    this.errors = ko.validation.group(this); 

}; 

var Source = function(collection) { 
    $.extend(this,collection); 
    this.id = "collection-"+this.code; 
    this.selected = ko.observable(true); 
}; 

Здесь я просто создать список исходных объектов из коллекции данных, которая приходит с сервера. Эти данные не имеют значения, поскольку меня интересует только видимое свойство «selected».

Разметка:

<div id="advanced-controls" class="row"> 
    <div class="col-sm-8"> 
     <fieldset id="search-fields"> 
      <div class="form-group"> 
       <label for="fullrecord" class="control-label">Keywords:</label> 
       <input type="text" id="fullrecord" class="form-control" name="fullrecord" placeholder="Full Record Search" data-bind="value:fullRecord" /> 
      </div> 
      <div class="form-group"> 
       <label for="title" class="control-label">Title:</label> 
       <input type="text" id="title" name="title" class="form-control" data-bind="value:title"/> 
      </div> 
      <div class="form-group"> 
       <label for="author" class="control-label">Author:</label> 
       <input type="text" id="author" name="author" class="form-control" data-bind="value:author"/> 
      </div> 
      <div class="form-group"> 
       <button id="advanced-search-submit" class="btn btn-primary" data-bind="click:search">Search</button> 
       <button id="advanced-search-reset" class="btn" data-bind="click: clear">Clear All</button> 
      </div> 
     </fieldset> 
    </div> 
    <div class="col-sm-4"> 
     <fieldset data-bind="foreach: sources"> 
      <div class="form-group"> 
       <input type="checkbox" name="collections" data-bind="attr:{ id:id, value:code }, checked:selected, click: $parent.clearRequiredSourceError "> 
       <label data-bind="attr:{ for:id }, text: name"></label> 
      </div> 
     </fieldset> 
    </div> 
</div> 

В функции проверки перед отправкой:

// If there's any knockout validation errors 
    if (model.errors().length > 0) { 
     model.errors.showAllMessages(); 
     isValid = false; 
    }  

Я попытался установить расширение пользовательской проверки на наблюдаемом массиве источников, как это:

this.sources = ko.observableArray(sources).extend({ 
     validation: { 
      validator : function (sources) { 
       var anySelected = false; 
       $(sources).each(function(){ 
        anySelected = this.selected(); 
       }); 
       return anySelected; 
      }, 
      message: 'At least one source is required to search.' 
     } 
    }); 

Но это не срабатывает при нажатии на эти флажки, только когда массив равен c повешен ~ толчок, поп и т.д. Да я конфиг установлены правильно:

ko.validation.configure({ 
     grouping: { 
      deep: true, 
      observable: true 
     } 
    }); 

Это кажется, что это должно быть очень просто достичь. Может быть, мой мозг просто обжарен из дайвинга во всем мире нокаутов на этой неделе. Любые предложения приветствуются. Заранее спасибо!

ответ

2

Простите, что не читает весь свой вопрос, так как это очень долго, но мне интересно, если вам нужно подтверждение Нокаут для этого, или если вы ищете что-то вроде этого -

var selectedOption = ko.observable(); 
var selectionsOk = ko.computed(function() { 
    ((!!field1()|| !!field1()|| !!field1())&&!!selectedOption()) 
}); 

Где selectedOption является список переключателей, и после того, как один из них выбран, возвращается значение, и вы можете либо использовать наблюдаемый массив, чтобы содержать каждое из своих полей, чтобы оно было динамическим, либо вы указывали поля и следили за тем, чтобы хотя бы одно из них имело значение , Привет! будет оценивать ваш наблюдаемую как истинный или ложный, правда, будет возвращено, если значение Наблюдаемых не было null, undefined, '' или false

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

+0

Вы правы. Это было намного проще, просто используя нокаут в одиночку. Я смог создать два отдельных вычисляемых логических наблюдателя с необходимой логикой проверки. Наблюдаемые видимо связаны с уникальным интервалом msg. Отлично работает, спасибо за подсказку! – headz68

+0

есть !! специальный оператор или это двойное отрицание? как он работает здесь? –

+2

Он преобразует что угодно в boolean. В основном все, что не является нулевым, неопределенным, '' или false, вернет true. –

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