最近我使用的应用程序从jQuery 1.7.1升级到1.10.2,其中包含Migrate 1.2.1.
升级后,我们注意到jQuery为扩展方法返回了不同的结果,data具体取决于选择器是否有任何结果.该attr扩展方法总是返回undefined无论选择的结果.
使用以下HTML文档,我使用版本1.7.1,1.8.3,1.9.1和1.10.2运行测试.
<html>
<head></head>
<body>
<div id="results">trying to access .data member off a selector that returns no results</div>
<script type="text/javascript" src="jQuery.js"></script>
<script type="text/javascript">
$(function(){
var target = $("#results");
target.append("<div>jQuery " + $.fn.jquery + " => " + $("p").data("blah") + "</div>");
target.append("<div>jQuery " + $.fn.jquery + " => " + $("p").attr("data-blah") + "</div>");
target.append("<div>jQuery " + $.fn.jquery + " => " + $("body").data("blah") + "</div>");
target.append("<div>jQuery " + $.fn.jquery + " => …Run Code Online (Sandbox Code Playgroud) 我目前有两个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:为空.
有没有更好的模式来实现相同的最终结果并使代码更灵活?