我有一种情况需要验证我的 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()));
});
关于javascript - 带有可观察参数的 Knockout 自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20380986/