使用可观察参数进行Knockout Custom Validation

 手机用户2502912197 发布于 2023-02-12 19:47

我有一种情况需要验证视图模型中字段的最大数量.但是,最大数量必须是可变的,并根据在此模型外部选择的UI项目计算.我试图在我的自定义验证器中包含observable作为参数,但是当值发生更改时,它似乎不会更新.

我有一种感觉,一旦第一次执行验证代码,它就会保留参数.

没有使用Knockout的列表的HTML


这是我正在使用的代码的笨拙版本.

var SpecifiedValuablesViewModel = function (maxSpecifiedItemAmount) {
    var self = this;

    self.maxSpecifiedItemAmount = ko.observable(maxSpecifiedItemAmount);

    self.amountToAdd = ko.observable().extend({
        validation: {
            validator: function (val, max) {
                return val <= max;
            },
            message: 'The amount must be a maximum of £{0}',
            params: self.maxSpecifiedItemAmount()
        }
    });
};

var specifiedValuablesViewModel = new SpecifiedValuablesViewModel($('#ContentsReplacementAmount').val());
ko.applyBindings(ko.validatedObservable(specifiedValuablesViewModel), document.getElementById('SpecifiedValuables'));

maxSpecifiedAmount之外的事件

$('#ContentsReplacementAmount').on('change', function () {
    specifiedValuablesViewModel.maxSpecifiedItemAmount(parseInt($(this).val()));
});

我的问题是,我怎样才能做到这一点?

1 个回答
  • 我现在设法使用以下代码解决这个问题:

    创建自定义验证器功能

    var customMax = function(val, max) {
        return val <= max();
    };
    

    传递验证函数并将消息包装在函数中

    var SpecifiedValuablesViewModel  = function (maxSpecifiedItemAmount) {
        var self = this;
    
        self.maxSpecifiedItemAmount = ko.observable(maxSpecifiedItemAmount);
    
        self.amountToAdd = ko.observable().extend({
            validation: {
                validator: customMax,
                message: function () { return 'The maximum allowed is ' + self.maxSpecifiedItemAmount(); },
                params: self.maxSpecifiedItemAmount
            }
        });
    
        self.maxSpecifiedItemAmount.subscribe(function (amount) {
            self.amountToAdd.isModified(false);
        });
    };
    
    var specifiedValuablesViewModel = new SpecifiedValuablesViewModel($('#ContentsReplacementAmount').val());
    ko.applyBindings(ko.validatedObservable(specifiedValuablesViewModel), document.getElementById('SpecifiedValuables'));
    
    $('#ContentsReplacementAmount').on('change', function () {
        specifiedValuablesViewModel.maxSpecifiedItemAmount(parseInt($(this).val()));
    });
    

    JSFiddle示例

    2023-02-12 19:51 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有