【问题标题】:Best approach for value conversion in KnockoutJS?KnockoutJS 中价值转换的最佳方法?
【发布时间】:2013-01-31 17:09:30
【问题描述】:

我一直在尝试找出在 Knockout-JS 中显示/编辑百分比值的正确方法(更一般地说,我应该如何创建像这样的可重用组件)。

我的 ViewModel 有一个可观察值,它是存储为小数的百分比,例如0.5 代表 50%。我想以百分比格式显示编辑值(例如“50”),这样用户就不会感到困惑(他们很容易感到困惑)。

可写计算

我可以通过设置一个可写的计算函数得到一个简单的版本:见http://jsfiddle.net/Quango/fvpjN/

但是,这不是很可重用,因为它需要为每个值重新实现。我尝试了一个扩展器,但这有效地掩盖了底层价值,因此使其无法使用。

BindingHandlers

认为我需要的是一个绑定处理程序,所以不要写

<input data-bind="value: commission" /> 

我会写

<input data-bind="percentage: commission" />

我查看了 knockout.js 中“值”bindingHandler 中的代码,但那里有很多用于绑定的代码,我不想复制这些代码。

所以我的问题是:

  1. 是否有一种好的/标准/模板方式来进行这种价值转换?

  2. 如果没有,有没有办法重复使用“值”绑定而无需复制和粘贴现有代码?

【问题讨论】:

    标签: knockout.js valueconverter


    【解决方案1】:

    我一直想写一个扩展程序。因此,您的问题的另一个答案是通过淘汰赛扩展器实现的。

    我还没有决定是更喜欢这个还是 Percentage 类的那个。

    HTML

    <input data-bind="value: p1.percentage, valueUpdate: 'afterkeydown'"></input>%
    = <span data-bind="text: p1"></span>
    

    JavaScript

    ko.extenders.percentage = function(target, option) {
        target.percentage = ko.computed({
            read: function() {
                return this() * 100;
            },
            write: function(value) {
                this(value/100);
            },
            owner: target
        });
        return target;
    };
    
    var model = {
        p1: ko.observable(0.5).extend({'percentage': true})
    }
    
    ko.applyBindings(model)
    

    现场演示

    http://jsfiddle.net/DWRLr/

    【讨论】:

    • 你是明星!这两个答案都很好,但我认为你的扩展器正是我试图找到的错误。它简单、可重复使用且不言自明。我可以将此设计重新用作通用值转换器。
    【解决方案2】:

    如何将分数和百分比值包装在一起,使其成为可重用的组件:

    HTML

    <input data-bind="value: p1.value, valueUpdate: 'afterkeydown'"></input>
    <h1><span data-bind="text: p1.frac"></span> = <span data-bind="text: p1"></span></h1>
    

    JavaScript

    function Percentage(frac) {
        this.frac = ko.observable(frac);
        this.value = ko.computed({
            read: function() {
                return this.frac() * 100;
            },
            write: function(value) {
                this.frac(value/100);
            },
            owner: this
        });
    }
    
    Percentage.prototype.toString = function() {
        return this.value() + '%';
    }
    
    var model = {
        p1: new Percentage(0.5)
    }
    
    ko.applyBindings(model)
    

    现场演示

    http://jsfiddle.net/9kCkm/1/

    【讨论】:

    • 我更喜欢这个答案。进一步记住的步骤更少,并且在第一枪中就奏效了
    猜你喜欢
    • 1970-01-01
    • 2019-11-01
    • 2014-04-06
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2017-03-12
    相关资源
    最近更新 更多