【问题标题】:Validate input value, if it's wrong than set default验证输入值,如果错误则设置默认值
【发布时间】:2014-10-27 18:03:13
【问题描述】:

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

在输入开始时我有 0.56 我将其更改为 0.95 。所以扩展器正在检查 0.95 是否大于 0.85,并将值更改为 0.85。不幸的是,在我的情况下仍然是 0.95。我在 target(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: '' });

【问题讨论】:

  • 除了缺少括号外,这似乎工作正常,请参阅jsfiddle.net/a75oqxtw
  • 如果这样写的话就可以了。不幸的是,当我在前端输入字段时,它不起作用
  • 您能否尝试使用jsfiddle.net 重现您的情况。我想也许你没有在输入中使用扩展的 observable。
  • 不幸的是,我对 jsfiddle 有一些问题,这就是为什么我在 CodePen 中创建我的示例的原因,第一次更改得到验证,但最新没有

标签: knockout.js knockout-validation


【解决方案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/

【讨论】:

  • 嗨@Jerry。非常感谢。在 CodePen 中工作。所以我会检查你的帖子,就像一个答案。不幸的是,在我的解决方案中不是因为我有一个自定义绑定来显示这个值。不幸的是,自定义绑定不起作用(请检查CodePen)
  • 快速浏览了一下,但您的自定义绑定似乎存在一个单独的问题。我认为 init 部分中的 ko.utils.registerEventHandler 和 ifself 更新艺术之间存在冲突(你不需要两者)。
【解决方案2】:

如果值通过验证,则不会更新 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;
};

【讨论】:

  • 我仍然有同样的问题。第一次是更新,但后来@Jerry 不是已经分享了一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-08-17
  • 2017-12-05
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 2011-07-06
相关资源
最近更新 更多