Knockout.js 将验证从可观察移动到计算
我有一个自定义的KO扩展,用于格式化数字,这个扩展将原始的可观测数据包装在一个computed中,并将新的引用返回给computed 有一个问题,假设在调用数字扩展器之前,有人向可观察对象添加验证,那么当数字扩展器公开计算结果时,该验证将不起作用 我能把验证从可观察的转移到计算的吗 当然,我可以确保在数字扩展器之后添加验证,但这感觉不是很可靠,尤其是在大型项目中 扩展器看起来像Knockout.js 将验证从可观察移动到计算,knockout.js,knockout-validation,Knockout.js,Knockout Validation,我有一个自定义的KO扩展,用于格式化数字,这个扩展将原始的可观测数据包装在一个computed中,并将新的引用返回给computed 有一个问题,假设在调用数字扩展器之前,有人向可观察对象添加验证,那么当数字扩展器公开计算结果时,该验证将不起作用 我能把验证从可观察的转移到计算的吗 当然,我可以确保在数字扩展器之后添加验证,但这感觉不是很可靠,尤其是在大型项目中 扩展器看起来像 ko.extenders.asNumber = function (target) { var result
ko.extenders.asNumber = function (target) {
var result = ko.computed({
read: function () {
return Globalize.format(target(), "N2");
},
write: function (value) {
if (value != null && value.substr) {
var parsedValue = Globalize.parseFloat(value);
if (isNaN(parsedValue)) {
parsedValue = value;
}
value = parsedValue;
if (!String.hasValue(value))
value = null;
}
target(value);
target.valueHasMutated();
}
});
target.hasValue = function () {
return target() != null && target() != 0;
};
result.raw = target;
return result;
};
更新:
解决这个问题的一个办法是
function copyValidation(observable, newObservable) {
if (observable.__valid__) {
newObservable.extend({ validatable: true });
ko.utils.arrayForEach(observable.rules(), function(rule) {
newObservable.rules.push(rule);
});
observable.rules([]);
}
}
最终版本
如果没有人有更好的方法,我会去的
function moveValidation(observable, newObservable) {
if (observable.__valid__) {
newObservable.extend({ validatable: true });
ko.utils.arrayForEach(observable.rules(), function(rule) {
newObservable.rules.push(rule);
});
observable.extend({ validatable: false });
}
}
更新
上面的解决方案具有observable.extend{validatable:false};在捆绑和缩小脚本后,由于某些原因无法工作。可观察。规则[];工作