将验证从observable移至计算

时间:2013-10-01 15:11:09

标签: knockout.js knockout-validation

我有一个自定义KO扩展,可以格式化数字,这个扩展程序在计算中包装原始的observable并返回对计算的新引用。

有一个问题,让我们说在数字扩展器被称为有人向可观察对象添加验证之前向下链,然后当数字扩展器公开计算机时,此验证将不起作用。

我可以以某种方式将验证从observable移动到计算中吗?

当然我可以确保在数字扩展器之后添加验证,但这感觉不是很稳固,尤其是在大型项目中

扩展器看起来像

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 });的上述解决方案由于某种原因在捆绑和缩小脚本后无法正常工作。 observable.rules([]);有效

0 个答案:

没有答案