【发布时间】:2013-04-14 12:58:50
【问题描述】:
我已尝试实施以下建议,但每次更新值时似乎都没有触发所需的反应。这可能是由于我是 Knockout 的新手,所以我的实施。
我有一个绑定到 TextBoxFor 的 observable (Amount)。
@Html.TextBoxFor(m => m.Amount, new { type = "number", data_bind = "value: Amount" })
当输入一个值时,需要对其进行验证以确保它不超过 999999。除此之外,如果该值小于 50,则需要将其设置为 50。这些检查需要在每个“金额”更改的时间。
var viewModel = {
Amount: ko.observable().extend({numeric: 0, max: 999999})
};
我已尝试实施解决方案(在我之前帖子的答案中),但我无法让这些解决方案发挥作用。
我想出的最好方法是创建一个计算如下。这将检查输入值并在第一次尝试时正确更新。随后的值更改不会触发屏幕上的更改,但单步执行代码似乎会更新 ViewModel.Amount 值。
@Html.TextBoxFor(m => m.Amount, new { type = "number", data_bind = "value: amountMin" })
quoteVehicleViewModel.VehicleMileage = ko.observable(0);
viewModel.amountMin = ko.computed({
read: function () {
return viewModel.Amount();
},
write: function (value) {
if (value < 50) {
viewModel.Amount(50);
}
}
}).extend({ numeric: 0, max: 999999 });
** 在控制台中输入的“viewModel.Amount()”显示值为 1000,但屏幕上的值仍显示为输入的值。
感谢您的帮助
约翰
【问题讨论】:
-
非常感谢您的回复 Joseph - 我已经看到您的 JSFiddle 工作了。我已经尝试在我的解决方案中实现,虽然我可以看到 coerceMin 函数在页面加载时运行,但当我更改文本框中的值时它不会被命中。除了您在下面添加的代码之外,是否还有其他密钥(来自您的 JSFiddle)需要执行此操作?
-
有一条偷偷摸摸的行
ko.validation.registerExtenders();我没有在答案中放入实际的扩展器 sn-p 。您是否将这一行包含在您的代码中? -
你好。是的,我已经包含了 registerExtenders 并且 coerceMin 代码在页面加载时触发,而不是在输入值时触发。谢谢
标签: knockout.js knockout-2.0 knockout-validation