Я пытаюсь сделать очень простую проверку с помощью плагина проверки нокаута. Я хочу проверить, имеет ли хотя бы одно текстовое поле текст и по крайней мере один флажок установлен. Все привязки работают правильно, и нокаут сам по себе является удивительным. Я тестировал собственные правила проверки, и они работают с сообщениями. Я просто не могу получить валидацию для работы над этими 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
}
});
Это кажется, что это должно быть очень просто достичь. Может быть, мой мозг просто обжарен из дайвинга во всем мире нокаутов на этой неделе. Любые предложения приветствуются. Заранее спасибо!
Вы правы. Это было намного проще, просто используя нокаут в одиночку. Я смог создать два отдельных вычисляемых логических наблюдателя с необходимой логикой проверки. Наблюдаемые видимо связаны с уникальным интервалом msg. Отлично работает, спасибо за подсказку! – headz68
есть !! специальный оператор или это двойное отрицание? как он работает здесь? –
Он преобразует что угодно в boolean. В основном все, что не является нулевым, неопределенным, '' или false, вернет true. –