Sam*_*m R 5 javascript knockout-2.0 knockout.js
我目前有两个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;
};
Run Code Online (Sandbox Code Playgroud)
在数值方法中,我可以检查格式化成员并将其分配给新计算但我不想让它知道其他方法.如果我决定从观察或扩展中添加更多成员,这也将无法维护.
if(target.hasOwnProperty("formatted")){
result.formatted = target.formatted;
}
Run Code Online (Sandbox Code Playgroud)
这是一个没有hasOwnProperty修复的小提琴. http://jsfiddle.net/gs5JM/2/
请注意,由于扩展程序应用程序的顺序和格式化成员的丢失,MyValue4 - Format:为空.
有没有更好的模式来实现相同的最终结果并使代码更灵活?
问题是你的format扩展器引用了原始的可观察值并numeric创建了一个新的可观察值。因此format,numeric使用完全不同的可观测值。看起来您应该考虑在这两种情况下返回原始可观察值。
我会numeric这样重写你的:
ko.extenders.numeric = function(target, precision) {
ko.computed(function(){
var current = parseFloat(target());
target(isNaN(current) ? 0 : current.toFixed(precision));
});
return target;
};
Run Code Online (Sandbox Code Playgroud)
Anonymouscomputed将创建一个对target价值变化的订阅并立即评估。评估函数将尝试解析一个值并将精确的数值重新分配给目标可观察量。
注意:您不应该关心可能的循环依赖,因为 KO在已经评估 时不会重新评估computed。