gpt4 book ai didi

javascript - 什么是保留在 Knockout 扩展中创建的自定义属性的好模式?

转载 作者:搜寻专家 更新时间:2023-11-01 04:37:20 26 4
gpt4 key购买 nike

我目前有两个 Knockout 扩展函数。一个向 Observable 添加一个成员,而另一个拦截读写操作。

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

下面是简化的代码示例。

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 的 fiddle 。 http://jsfiddle.net/gs5JM/2/

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

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

最佳答案

问题是您的 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/

备注:You should not care about possible circular dependency because KO will not re-evaluate computed while it's already evaluating .

关于javascript - 什么是保留在 Knockout 扩展中创建的自定义属性的好模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com