in google-cloud-server/src/main/resources/buildServerResources/knockout.validation-2.0.3.js [1194:1291]
ko.extenders['validatable'] = function (observable, options) {
if (!kv.utils.isObject(options)) {
options = { enable: options };
}
if (!('enable' in options)) {
options.enable = true;
}
if (options.enable && !kv.utils.isValidatable(observable)) {
var config = kv.configuration.validate || {};
var validationOptions = {
throttleEvaluation : options.throttle || config.throttle
};
observable.error = ko.observable(null); // holds the error message, we only need one since we stop processing validators when one is invalid
// observable.rules:
// ObservableArray of Rule Contexts, where a Rule Context is simply the name of a rule and the params to supply to it
//
// Rule Context = { rule: '<rule name>', params: '<passed in params>', message: '<Override of default Message>' }
observable.rules = ko.observableArray(); //holds the rule Contexts to use as part of validation
//in case async validation is occurring
observable.isValidating = ko.observable(false);
//the true holder of whether the observable is valid or not
observable.__valid__ = ko.observable(true);
observable.isModified = ko.observable(false);
// a semi-protected observable
observable.isValid = ko.computed(observable.__valid__);
//manually set error state
observable.setError = function (error) {
var previousError = observable.error.peek();
var previousIsValid = observable.__valid__.peek();
observable.error(error);
observable.__valid__(false);
if (previousError !== error && !previousIsValid) {
// if the observable was not valid before then isValid will not mutate,
// hence causing any grouping to not display the latest error.
observable.isValid.notifySubscribers();
}
};
//manually clear error state
observable.clearError = function () {
observable.error(null);
observable.__valid__(true);
return observable;
};
//subscribe to changes in the observable
var h_change = observable.subscribe(function () {
observable.isModified(true);
});
// we use a computed here to ensure that anytime a dependency changes, the
// validation logic evaluates
var h_obsValidationTrigger = ko.computed(extend({
read: function () {
var obs = observable(),
ruleContexts = observable.rules();
kv.validateObservable(observable);
return true;
}
}, validationOptions));
extend(h_obsValidationTrigger, validationOptions);
observable._disposeValidation = function () {
//first dispose of the subscriptions
observable.isValid.dispose();
observable.rules.removeAll();
h_change.dispose();
h_obsValidationTrigger.dispose();
delete observable['rules'];
delete observable['error'];
delete observable['isValid'];
delete observable['isValidating'];
delete observable['__valid__'];
delete observable['isModified'];
delete observable['setError'];
delete observable['clearError'];
delete observable['_disposeValidation'];
};
} else if (options.enable === false && observable._disposeValidation) {
observable._disposeValidation();
}
return observable;
};