Позвольте мне предложить альтернативу. Хотя использование ручной подписки может быть полезно, есть ИМХО более элегантные способы сделать это в Knockout. Самым основным является один вычислен наблюдаемым:
var MainViewModel = function() {
var self = this;
self.firstName = ko.observable('');
self.validnessCssClass = ko.computed(function() {
return !self.firstName() ? 'fa-exclamation-circle' : 'fa-check-circle';
});
}
ko.applyBindings(new MainViewModel());
.fa { color: red; font-weight: bold; }
.fa-check-circle:before { content: " "; }
.fa-exclamation-circle:before { content: "!!!"; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
<input type="text" data-bind="value: firstName, valueUpdate: 'afterkeydown'" />
<i class="fa" data-bind="css: validnessCssClass"></i>
Второй подход использует extenders, что сделает результирующий код выглядеть очень похоже, что с knockout-validation. Heck, связанные документы содержат даже пример для проверки required
, позвольте мне опубликовать, что здесь объявление дословно:
ko.extenders.required = function(target, overrideMessage) {
//add some sub-observables to our observable
target.hasError = ko.observable();
target.validationMessage = ko.observable();
//define a function to do validation
function validate(newValue) {
target.hasError(newValue ? false : true);
target.validationMessage(newValue ? "" : overrideMessage || "This field is required");
}
//initial validation
validate(target());
//validate whenever the value changes
target.subscribe(validate);
//return the original observable
return target;
};
Спасибо @ AldoRomo88. Работа как ожидалось. –
как включить/отключить кнопку на основе значения элемента с помощью специальной привязки checkicon –