我一直在努力找出在 Knockout-JS 中显示/编辑百分比值的正确方法(以及更一般地说,我应该如何创建这样的可重用组件)。
我的视图模型有一个可观察值,它是存储为小数的百分比,例如 0.5 表示 50%。我想以百分比格式显示和编辑值(例如"50"),这样用户就不会感到困惑(他们很容易感到困惑)。
可写计算
我能够通过设置一个可写的计算函数来获得一个简单的版本:见 http://jsfiddle.net/Quango/fvpjN/
但是,这不是非常可重用的,因为它需要为每个值重新实现。我尝试了一个扩展器,但这有效地掩盖了潜在值,因此使其无法使用。
绑定处理程序
我认为我需要的是一个绑定处理程序,所以而不是编写
<input data-bind="value: commission" />
我会写
<input data-bind="percentage: commission" />
我看了一下 knockout.js 中"value" bindingHandler 中的代码,但是那里有很多用于绑定的代码,我不想复制它。
所以我的问题是:
有没有一种好的/标准/模板的方式来进行这种价值转换?
如果没有,有没有办法重用"值"绑定而无需复制和粘贴现有代码?
想写一个扩展器。因此,这是通过挖空扩展器实现的问题的另一个答案。
我仍然不确定我是否更喜欢这个或百分比类的那个。
.HTML
<input data-bind="value: p1.percentage, valueUpdate: 'afterkeydown'"></input>%
= <span data-bind="text: p1"></span>
JavaScript
ko.extenders.percentage = function(target, option) {
target.percentage = ko.computed({
read: function() {
return this() * 100;
},
write: function(value) {
this(value/100);
},
owner: target
});
return target;
};
var model = {
p1: ko.observable(0.5).extend({'percentage': true})
}
ko.applyBindings(model)
现场演示
http://jsfiddle.net/DWRLr/
如何将分数值和百分比值包装在一起,使其成为可重用的组件:
.HTML
<input data-bind="value: p1.value, valueUpdate: 'afterkeydown'"></input>
<h1><span data-bind="text: p1.frac"></span> = <span data-bind="text: p1"></span></h1>
JavaScript
function Percentage(frac) {
this.frac = ko.observable(frac);
this.value = ko.computed({
read: function() {
return this.frac() * 100;
},
write: function(value) {
this.frac(value/100);
},
owner: this
});
}
Percentage.prototype.toString = function() {
return this.value() + '%';
}
var model = {
p1: new Percentage(0.5)
}
ko.applyBindings(model)
现场演示
http://jsfiddle.net/9kCkm/1/