如何使用 Knockout.js 自定义绑定处理文本字段的内容?

泰西格

我有一个初始值为 0.00 的简单文本字段。但是,当我删除文本字段的内容并且焦点转到另一个元素时,返回了以前的格式 0.00。删除其内容后,我希望有空字段。代码如下所示:

1) 模板:

<div class="group">
    <p class="ds-field-name top width-auto">To</p>
    <input class="ds-input width-fixed-quarter" type="text" data-bind="moneyInfinity: fields.amountTo, moneyMultiplier: 100, moneyABS: true"/>
</div>

2)自定义绑定:

ko.bindingHandlers.moneyInfinity = {
    format(data) {
        if (typeof data === 'undefined' || data === null) return '';
        const num = parseFloat(data) || 0;
        return num.toFixed(2);
    },
    init(element, valueAccessor, allBindingsAccessor) {
        const value = valueAccessor();
        const bindings = allBindingsAccessor();
        const multiplier = (bindings.moneyMultiplier !== '' && undefined !== bindings.moneyMultiplier)
            ? bindings.moneyMultiplier : 1.00;

        const abs = bindings.moneyABS || false;

        const format = ko.bindingHandlers.money.format;

        $(element).change(function () {
            const $this = $(this);

            if ($this.val() === '') {
                $this.val(null);
                value(null);

                return;
            }

            const normalized = ($this.val() || '0').replace(',', '.');
            const newData = format(abs ? Math.abs(normalized) : normalized);

            $this.val(multiplier);
            value(newData * multiplier);
        });
    },
    update(element, valueAccessor, allBindingsAccessor) {
        const main = ko.unwrap(valueAccessor());
        const value = valueAccessor();
        const bindings = allBindingsAccessor();
        const multiplier = bindings.moneyMultiplier || 1.00;
        const abs = bindings.moneyABS || false;

        const format = ko.bindingHandlers.money.format;

        if (value() === '') {
            return;
        }

        $(element).val(format(abs ? Math.abs(value() / multiplier) : value() / multiplier));
    }
};
杰森说话

我认为它一直回到“0.00”的主要原因是 UI 正在更新模型,然后导致模型再次更新 UI。在您的绑定中,当模型更新时,它总是将输出格式化为 UI,因此它将该部分视为空白并将“0.00”发送回 UI。

我必须进行一些其他更改才能使其正常工作,但这里有一个更新的绑定:

function format(data) {
        if (typeof data === 'undefined' || data === null) return '';
        const num = parseFloat(data) || 0;
        return num.toFixed(2);
    }
    
ko.bindingHandlers.moneyInfinity = {
    init(element, valueAccessor, allBindingsAccessor) {
        const value = valueAccessor();
        const bindings = allBindingsAccessor();
        const multiplier = (bindings.moneyMultiplier !== '' && undefined !== bindings.moneyMultiplier)
            ? bindings.moneyMultiplier : 1.00;

        const abs = bindings.moneyABS || false;

        //const format = ko.bindingHandlers.money.format;

        $(element).change(function () {
            const $this = $(this);
	
            if ($this.val() === '') {
                //$this.val(null); //Not sure what this was supposed to do
                value(null);

                return;
            }

            const normalized = ($this.val() || '0').replace(',', '.');
            const newData = format(abs ? Math.abs(normalized) : normalized);

            //$this.val(multiplier); //Not sure what this was supposed to do
            value(newData * multiplier);
            value.notifySubscribers(); //force an update even if value  evaluates the same. "0" == "0.00"
        });
    },
    update(element, valueAccessor, allBindingsAccessor) {
        const main = ko.unwrap(valueAccessor());
        const value = valueAccessor();
        const bindings = allBindingsAccessor();
        const multiplier = bindings.moneyMultiplier || 1.00;
        const abs = bindings.moneyABS || false;

        //const format = ko.bindingHandlers.money.format;

        if (!value() && typeof(value()) != "number") { //ignore null, undefined, and blank
            return;
        }

        $(element).val(format(abs ? Math.abs(value() / multiplier) : value() / multiplier));
    }
};

function viewModel(){
  this.fields = {
    amountTo: ko.observable('')
  };
}

ko.applyBindings(new viewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

<div class="group">
    <p class="ds-field-name top width-auto">To</p>
    <input class="ds-input width-fixed-quarter" type="text" data-bind="moneyInfinity: fields.amountTo, moneyMultiplier: 100, moneyABS: true"/>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用自定义绑定来对在Knockout.js中使用“ foreach”添加的元素进行动画处理

来自分类Dev

使用自定义绑定时如何更新Knockout ViewModel

来自分类Dev

使用Knockout Js进行Ajax数据绑定

来自分类Dev

使用jQuery的Knockout.js数据绑定

来自分类Dev

在Knockout.js中两次绑定自定义处理程序

来自分类Dev

在Knockout.js中两次绑定一个自定义处理程序

来自分类Dev

如何使用 Knockout.js 在表格中显示文本或链接

来自分类Dev

使用Knockout + Typeahead自定义绑定更新文本框中的值

来自分类Dev

更改可观察数组会更改自定义绑定处理程序knockout.js的可见性

来自分类Dev

如何强制Knockout.js更新UI(重新评估绑定)

来自分类Dev

如何在Knockout.js中绑定输入类型“时间”

来自分类Dev

如何在 Knockout 中的自定义 bindingHandler 中绑定到自定义模板

来自分类Dev

Knockout.js:使用过滤器绑定foreach

来自分类Dev

Knockout.js使用Rowspan绑定2D表

来自分类Dev

使用Knockout.js绑定Bootstrap弹出窗口中的单击

来自分类Dev

使用knockout.js 过滤器绑定的问题

来自分类Dev

使用Knockout.js更新ejGrid中的各个字段

来自分类Dev

使用Knockout.js更新ejGrid中的各个字段

来自分类Dev

Knockout.js绑定范围

来自分类Dev

在Knockout js中删除绑定

来自分类Dev

Knockout.js安全绑定

来自分类Dev

Knockout.js if / shim绑定

来自分类Dev

更改Knockout.js绑定

来自分类Dev

绑定Knockout.js网格

来自分类Dev

当ajax请求定期自动刷新时,如何使用knockout.js数据绑定?

来自分类Dev

如何使用knockout.js将多个图像绑定到图形元素

来自分类Dev

如何使用JavaScript / Jquery / Knockout JS将数字数组绑定到Range Slider

来自分类Dev

如何使用knockout.js将多个图像绑定到图形元素

来自分类Dev

我如何使用foreach和SignalR防止子div被Knockout JS绑定

Related 相关文章

  1. 1

    如何使用自定义绑定来对在Knockout.js中使用“ foreach”添加的元素进行动画处理

  2. 2

    使用自定义绑定时如何更新Knockout ViewModel

  3. 3

    使用Knockout Js进行Ajax数据绑定

  4. 4

    使用jQuery的Knockout.js数据绑定

  5. 5

    在Knockout.js中两次绑定自定义处理程序

  6. 6

    在Knockout.js中两次绑定一个自定义处理程序

  7. 7

    如何使用 Knockout.js 在表格中显示文本或链接

  8. 8

    使用Knockout + Typeahead自定义绑定更新文本框中的值

  9. 9

    更改可观察数组会更改自定义绑定处理程序knockout.js的可见性

  10. 10

    如何强制Knockout.js更新UI(重新评估绑定)

  11. 11

    如何在Knockout.js中绑定输入类型“时间”

  12. 12

    如何在 Knockout 中的自定义 bindingHandler 中绑定到自定义模板

  13. 13

    Knockout.js:使用过滤器绑定foreach

  14. 14

    Knockout.js使用Rowspan绑定2D表

  15. 15

    使用Knockout.js绑定Bootstrap弹出窗口中的单击

  16. 16

    使用knockout.js 过滤器绑定的问题

  17. 17

    使用Knockout.js更新ejGrid中的各个字段

  18. 18

    使用Knockout.js更新ejGrid中的各个字段

  19. 19

    Knockout.js绑定范围

  20. 20

    在Knockout js中删除绑定

  21. 21

    Knockout.js安全绑定

  22. 22

    Knockout.js if / shim绑定

  23. 23

    更改Knockout.js绑定

  24. 24

    绑定Knockout.js网格

  25. 25

    当ajax请求定期自动刷新时,如何使用knockout.js数据绑定?

  26. 26

    如何使用knockout.js将多个图像绑定到图形元素

  27. 27

    如何使用JavaScript / Jquery / Knockout JS将数字数组绑定到Range Slider

  28. 28

    如何使用knockout.js将多个图像绑定到图形元素

  29. 29

    我如何使用foreach和SignalR防止子div被Knockout JS绑定

热门标签

归档