and*_*a86 19 javascript knockout-2.0 knockout.js
我读了很多教程,但我不知道怎么做,这是输入
input(type="text",name="price",id="price"data-bind="text: price,valueUpdate:['afterkeydown','propertychange','input']")
Run Code Online (Sandbox Code Playgroud)
这是我的viewModel
price: ko.computed(function()
{
return parseFloat(this.replace(' ','').replace(/[^0-9\.]+/g,"")) || '';
},this)
Run Code Online (Sandbox Code Playgroud)
但这导致错误:这没有方法替换??? 我怎样才能将价格值传递给计算函数?
小智 46
最好创建自定义绑定http://knockoutjs.com/documentation/custom-bindings.html,它只接受允许的字符[0-9,.]作为数字表示.
将此行放入您的视图中
<input id="text" type="text" data-bind="numeric, value: number">
Run Code Online (Sandbox Code Playgroud)
将此行放入您的模型中(记得将数字绑定为可观察的属性)
ko.bindingHandlers.numeric = {
init: function (element, valueAccessor) {
$(element).on("keydown", function (event) {
// Allow: backspace, delete, tab, escape, and enter
if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
// Allow: Ctrl+A
(event.keyCode == 65 && event.ctrlKey === true) ||
// Allow: . ,
(event.keyCode == 188 || event.keyCode == 190 || event.keyCode == 110) ||
// Allow: home, end, left, right
(event.keyCode >= 35 && event.keyCode <= 39)) {
// let it happen, don't do anything
return;
}
else {
// Ensure that it is a number and stop the keypress
if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
event.preventDefault();
}
}
});
}
};
Run Code Online (Sandbox Code Playgroud)
Knockout为此提供了扩展.从knockoutjs.com 检查这个,解释如何使用可观察的扩展器强制输入为数字.我粘贴文档中的代码:
源代码:查看
<p><input data-bind="value: myNumberOne" /> (round to whole number)</p>
<p><input data-bind="value: myNumberTwo" /> (round to two decimals)</p>
Run Code Online (Sandbox Code Playgroud)
源代码:查看模型
ko.extenders.numeric = function(target, precision) {
//create a writable computed observable to intercept writes to our observable
var result = ko.pureComputed({
read: target, //always return the original observables value
write: function(newValue) {
var current = target(),
roundingMultiplier = Math.pow(10, precision),
newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue),
valueToWrite = Math.round(newValueAsNum * roundingMultiplier) / roundingMultiplier;
//only write if it changed
if (valueToWrite !== current) {
target(valueToWrite);
} else {
//if the rounded value is the same, but a different value was written, force a notification for the current field
if (newValue !== current) {
target.notifySubscribers(valueToWrite);
}
}
}
}).extend({ notify: 'always' });
//initialize with current value to make sure it is rounded appropriately
result(target());
//return the new computed observable
return result;
};
function AppViewModel(one, two) {
this.myNumberOne = ko.observable(one).extend({ numeric: 0 });
this.myNumberTwo = ko.observable(two).extend({ numeric: 2 });
}
ko.applyBindings(new AppViewModel(221.2234, 123.4525));
Run Code Online (Sandbox Code Playgroud)
小智 5
我有一个类似的问题。
我还需要确保仅内部值,对于 IE9 及更高版本(因此 type=numberical 是不够的),并且由于我们有很多国际客户,我也不能依赖键码,所以以下是我最终的结果和:
//In my js class method (self is this as usual)
self.ensureNumberical = function (data, e) {
var keyValue = e.key;
if (keyValue.match(/[0-9]/g)) {
return true;
}
return false;
}
//In my MVC View
data-bind="event: { keypress: ensureNumberical }"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33028 次 |
| 最近记录: |