什么是保留在挖空扩展中创建的自定义属性的好模式
What is a good pattern to preserve custom properties created in a Knockout extension?
我目前有两个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
创建一个新的扩展器。因此,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;
};
匿名computed
将创建一个订阅,以target
值更改并立即进行评估。评估函数将尝试解析一个值,并将精确的数值重新分配给目标可观察量。
http://jsfiddle.net/gs5JM/3/
注意:您不应该关心可能的循环依赖关系,因为KO不会在computed
已经在评估时重新评估它。
相关文章:
- DataTables-创建自定义分页样式(加载更多样式)
- 如何在javascript中创建自定义事件
- 在angularjs中创建自定义控件的推荐方法
- 设置自动分隔符的自定义属性
- 与ng attr myCustomAttribute匹配的自定义属性指令
- 创建自定义函数以在函数上运行完整的多选下拉列表
- 获取自定义属性的值
- 在jquery和javascript中创建自定义日历背后的逻辑
- Magento创建自定义的职业表格,并从CMS页面调用
- 如何创建自定义属性以添加if.bind
- 什么是保留在挖空扩展中创建的自定义属性的好模式
- 在聚合物中创建自定义元素的属性为零
- 如何使用路由器和内置/自定义属性在aurelia中创建下拉菜单
- 将动态创建的下拉列表的自定义属性值添加到另一个元素
- JQuery:创建具有相同自定义属性的相应元素
- 用AngularJS创建一个自定义属性
- 如何为html中已经存在的标签创建和使用自定义属性?
- 如何使用动态名称创建Angular 2自定义属性指令
- 正在创建具有自定义属性的react元素
- 如何根据自定义属性对动态创建的元素进行排序