什么是保留在挖空扩展中创建的自定义属性的好模式

What is a good pattern to preserve custom properties created in a Knockout extension?

本文关键字:创建 自定义属性 模式 扩展 保留 什么      更新时间:2023-09-26

我目前有两个Knockout扩展函数。一个将成员添加到可观察量,而另一个截获读取和写入操作。

当组合扩展方法时,应用程序的顺序会产生不良影响。

下面的简化代码示例。

ko.extenders.format = function(target) {
    var result = ko.computed(function(){
        return "$" + target();
    });
    target.formatted = result;
   return target;
};
ko.extenders.numeric = function(target, precision) {
    var result = ko.computed({
        read: function() {
            var current = parseFloat(target());
           return current.toFixed(precision);
        },
        write: function(newValue) {
            newValue = parseFloat(newValue);
            target(newValue.toFixed(precision));
        }
    });
    return result;
};

在数值方法中,我可以检查格式化的成员并将其分配给新的计算,但我不想让它了解其他方法。如果我决定在可观察或扩展中添加更多成员,这也将无法维护。

if(target.hasOwnProperty("formatted")){
    result.formatted = target.formatted;
}

这是一个没有hasOwnProperty修复的小提琴。http://jsfiddle.net/gs5JM/2/

请注意,MyValue4 - 格式:由于扩展程序应用程序的顺序和格式化成员的丢失,为空。

是否有更好的模式来实现相同的最终结果并使代码更加灵活?

问题是您的format扩展器引用原始可观察的扩展器,numeric创建一个新的扩展器。因此,formatnumeric使用完全不同的可观察量。看起来您应该考虑在这两种情况下返回原始可观察的。

我会这样重写你的numeric

ko.extenders.numeric = function(target, precision) {
    ko.computed(function(){
        var current = parseFloat(target());
        target(isNaN(current) ? 0 : current.toFixed(precision));
    });
    return target;
};

匿名computed将创建一个订阅,以target值更改并立即进行评估。评估函数将尝试解析一个值,并将精确的数值重新分配给目标可观察量。

http://jsfiddle.net/gs5JM/3/

注意:您不应该关心可能的循环依赖关系,因为KO不会在computed已经在评估时重新评估它。