【发布时间】:2014-11-07 06:57:06
【问题描述】:
在我的应用程序中显示时,我正在使用 numeric.js 来格式化数字。但是,当我应用格式并尝试更改计算出的 observable 时,如果输入的值与格式化的值相同,则该值不会更新。
这是小提琴: http://jsfiddle.net/kwt8vy9u/5/
var ChangeWrite = true;
//Function to get first 2 non zero digits after decimal
ko.bindingHandlers.number = {
update: function (element, valueAccessor, allBindingsAccessor, data) {
var observable = valueAccessor(),
formatted = ko.computed({
read: function (key) {
ChangeWrite = false;
if (ko.isObservable(observable)) {
if (observable() || observable() === 0) {
var num = parseFloat(observable());
return numeral(num).format('0,0.00');
}
} else {
if (observable || observable === 0) {
var num = parseFloat(observable)
return numeral(num).format('0,0.00');
}
return '';
}
},
write: function (value) {
if (ChangeWrite) {
var change = true;
if (value != valueAccessor()()) {
change = true;
} else {
change = false;
}
if (!isNaN(value) && value !== '' && change && value.indexOf('-') < 0) {
valueAccessor()(value);
} else {
if ((change || value.indexOf('-') >= 0) && $("#dgConfirm").is(':visible') == false) {
alert('please enter valid value');
}
$(element).val(function () {
if (valueAccessor()() === '') return '';
else {
var num = valueAccessor()()
return numeral(num).format('0,0.00');
}
}());
}
} else {
ChangeWrite = false;
$(element).val(function () {
if (valueAccessor()() === '') return '';
else {
var num = valueAccessor()()
return numeral(num).format('0,0.00');
}
}());
}
},
disposeWhenNodeIsRemoved: element
}).extend({
notify: 'always'
});
ko.applyBindingsToNode(element, {
value: formatted
});
}
};
$(document).ready(function () {
$("#txtOriginal").blur(function () {
ChangeWrite = true;
});
function AppViewModel() {
this.value = ko.observable(10);
}
ko.applyBindings(new AppViewModel());
ChangeWrite = true;
});
例如:当我在文本框中输入 10.562 时,它被格式化为 10.56,而底层计算的 observable 仅包含 10.562。但是当我将值更改为 10.56 时,基础计算的 observable 不会更新。它仍在使用 10.562。在 IE10 和 chrome 中可以看到这个问题。它在 IE 中正常工作
谢谢,
普拉文。
【问题讨论】:
-
那是很多代码。您能否简化示例以仅关注 Knockout 问题?
-
我已经删除了不必要的代码并更新了我的小提琴。
标签: knockout.js