【问题标题】:Knocout js computed observable not updated淘汰赛 js 计算的 observable 未更新
【发布时间】: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


【解决方案1】:

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

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

然后在文本框中输入“1234”;并得到了“改变”。警告。

然后我删除了所有文本,再次输入“1234”,但没有收到警报。

基于此,我要说的是淘汰赛并没有得到你改变的事件,这意味着 observable 甚至永远不会看到改变。

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2020-05-30
    相关资源
    最近更新 更多