验证输入值,如果它错误,则设置为默认值

时间:2014-09-03 09:33:06

标签: knockout.js knockout-validation

我正在尝试编写输入字段值的验证。 如果值是错误的,那么我想设置一个默认值。 不幸的是,它正在检查它,设置默认值,然后设置错误的值。 我试图使用扩展程序验证。在我尝试使用"订阅"但再次没有成功。这是我关于场景的例子

  

在输入开始时我有0.56   我将它改为0.95。因此,扩展器检查0.95是否比0.85更粗,并将值更改为0.85。不幸的是,在我的情况下仍然是0.95。我添加了一些警告后目标(0.85)我可以看到该值正在变为0.85,但之后又是0.95。

知道我做错了吗?

这是我的代码

ko.extenders.checkInput = function (target) {

    var result = ko.computed({
        read: target,
        write: function (newValue) {

            if (newValue > 0.85) {
                target(0.85);
            } 

         });

    //return the new computed observable
    result(target());

    return result;


};

self.inputValue = ko.observable(0.56).extend({ checkInput: '' });

2 个答案:

答案 0 :(得分:1)

如果值没有改变,您需要使用notifySubscribers并将计算机扩展为始终通知有关更改(根据knockout documentation on extenders):

ko.extenders.checkInput = function(target, option) {
    var result = ko.computed({
        read: target,
        write: function(newValue) {
            var current = target(),
            valueToWrite = Math.min(newValue, 0.85);
            if (valueToWrite !== current) {
                target(valueToWrite);
            } else {
                if (newValue !== current) {
                    target.notifySubscribers(valueToWrite);
                }
            }
        }
    }).extend({ notify: 'always' });
    result(target());

    return result;
};

http://jsfiddle.net/w017dc50/

答案 1 :(得分:0)

如果值通过验证,则不会更新target。试试这个:

ko.extenders.checkInput = function (target) {

    var result = ko.computed({
        read: target,
        write: function (newValue) {
            target(Math.min(newValue, 0.85));
        }
    });

    //return the new computed observable
    result(target());

    return result;
};