Knockout js计算的observable没有更新

时间:2014-11-07 06:57:07

标签: knockout.js

我在应用程序中显示时使用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

中正常工作

谢谢,

普利文。

1 个答案:

答案 0 :(得分:0)

我打开你的小提琴,用这个代替了所有的代码:

$('#txtOriginal').change(function () {
    alert('Changed.');
});

在文本框中输入“1234”;得到了'改变'。警报。

然后我删除了所有文字,并再次输入“1234”,并没有得到警报。

基于此,我要说淘汰赛没有得到你改变的事件,这意味着观察者甚至不会看到变化。