javascript - 带有可观察参数的 Knockout 自定义验证

标签 javascript validation knockout.js knockout-validation

我有一种情况需要验证我的 View 模型中字段的最大数量。但是,最大数量必须是可变的,并且根据在此模型之外选择的 UI 项目进行计算。我试图将可观察对象作为参数包含在我的自定义验证器中,但它似乎不会在值更改时更新。

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

未使用 Knockout 的列表的 HTML

<select id="ContentsReplacementAmount">
    <option value="25000">£25000</option>
    <option value="50000">£50000</option>
    <option value="75000">£75000</option>
</select>

这是我正在使用的代码的简化版本。

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()));
});

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

最佳答案

我现在已经设法使用以下代码解决了这个问题:

创建自定义验证器函数

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 example

关于javascript - 带有可观察参数的 Knockout 自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20380986/

相关文章:

javascript - Angular、SignalR、WebAPI 入门问题

c# - 没有 Controller 的 Web API MVC 模型验证

javascript - 超时函数适用于一种形式,但忽略另一种形式

asp.net - ASP.NET Webforms 验证框架的推荐

asp.net - Knockout.js - 似乎没有正确绑定(bind),不明白为什么

javascript - 模板中的knockoutjs : binding to an observable property outside of an array,

javascript - 为什么不应用 CSS 过渡?

javascript - 使用 ng-repeat 迭代 AngularJS 中的数组

javascript - 如何以编程方式告诉要在数据表中编辑哪一行?

javascript - 在 &lt;script src="plugin.js> 中调用插件是一个好习惯吗?