我在应用程序中显示时使用numeral.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&lt; = 9
中正常工作谢谢,
普利文。
答案 0 :(得分:0)
我打开你的小提琴,用这个代替了所有的代码:
$('#txtOriginal').change(function () {
alert('Changed.');
});
在文本框中输入“1234”;得到了'改变'。警报。
然后我删除了所有文字,并再次输入“1234”,并没有得到警报。
基于此,我要说淘汰赛没有得到你改变的事件,这意味着观察者甚至不会看到变化。