Jquery ko.bindingHandlers.datepicker不适用于淘汰版3.0
目前我正在使用knockout 2.1.0,其中以下datepicker绑定对于不可观察的值非常有效。当我更新knockout 3.0时,它就不起作用了Jquery ko.bindingHandlers.datepicker不适用于淘汰版3.0,jquery,knockout.js,datepicker,knockout-2.0,knockout-3.0,Jquery,Knockout.js,Datepicker,Knockout 2.0,Knockout 3.0,目前我正在使用knockout 2.1.0,其中以下datepicker绑定对于不可观察的值非常有效。当我更新knockout 3.0时,它就不起作用了 ko.bindingHandlers.datepicker = { init: function(element, valueAccessor, allBindingsAccessor) { // Get the options from the binding. var options = allBin
ko.bindingHandlers.datepicker = {
init: function(element, valueAccessor, allBindingsAccessor) {
// Get the options from the binding.
var options = allBindingsAccessor().datepickerOptions || {};
$(element)
.datepicker(options)
.bind("change", function() {
ko.bindingHandlers.datepicker.updateValue(element, valueAccessor, allBindingsAccessor);
});
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$(element).datepicker("destroy");
});
},
update: function(element, valueAccessor, allBindingsAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
// If the date is coming from a Microsoft webservice.
if (typeof value === "string" && value.indexOf('/Date(') === 0) {
value = new Date(parseInt(value.replace(/\/Date\((.*?)\)\//gi, "$1")));
}
var currentDate = $(element).datepicker("getDate");
// Check if the date has changed.
if (value && value - currentDate !== 0) {
$(element).datepicker("setDate", value);
}
},
updateValue: function(element, valueAccessor, allBindingsAccessor) {
var observable = valueAccessor(),
dateValue = $(element).datepicker("getDate");
// Two-way-binding means a writeable observable.
if (ko.isWriteableObservable(observable)) {
observable(dateValue);
return;
}
if (allBindingsAccessor()._ko_property_writers) {
allBindingsAccessor()._ko_property_writers.datepicker(dateValue);
}
}
};
调试代码时,我知道是allBindingsAccessor()。\u ko_property\u writers
未定义。因此,我无法更新不可见的值
有人能为我推荐3.0版本中上述代码的解决方案吗
通过使用下面的例子,我已经修改了我的自定义绑定,它工作得很好。请查找更新的fiddle
问题在于
\u ko\u property\u writers
是一个私有的实现细节(这就是为什么名称的前缀是\u
)。如果你阅读,你会发现它陈述了以下内容:
从长远来看,让绑定显式声明自己为“双向”并不理想(如果所有绑定都可以使用官方的“属性编写器”API,而不需要声明它们可能会这样做,那就更好了)。然而,由于这不是,也从来不是一个公共API(从来没有记录过属性编写器),因此短期内它可以作为一个内部实现细节
对于那些在自定义绑定中依赖_ko_property_writer的开发人员,我们将_twoWayBindings作为一种未记录的特性公开,这使得升级到ko 3.0相对容易。然而,这仍然不是一个官方的公共API,如果我们创建了一个真正的公共属性API,我们保留随时删除它的权利
因此,似乎还没有一个公共API不会更改为将来的版本,但在决定并提供这样一个API之前,您应该能够使用\u twoWayBindings
更新2014-04-15-添加设置双向绑定标志的示例
\u twoWayBindings
设置(很遗憾,它可能会在任何未来版本的knockout中消失,因为它不是一个真正的公共API)是一个标志,您可以在创建bindingHandler
时设置它,告诉knockout为您的bindingHandler
创建一个\u ko\u属性\u writers
条目。设置此标志的方式类似于创建新bindingHandler的方式:
ko.expressionRewriting._twoWayBindings['simpleTwoWayBinding'] = true;
绑定的完整示例,该绑定将对不可观察的属性进行双向绑定:
ko.expressionRewriting._twoWayBindings['simpleTwoWayBinding'] = true;
ko.bindingHandlers['simpleTwoWayBinding'] = {
init: function(element, valueAccessor, allBindings, viewModel){
element.value = valueAccessor();
var valueSetter = allBindings.get('_ko_property_writers').simpleTwoWayBinding;
element.addEventListener('change', function(){
valueSetter(element.value);
});
}
};
我有一个工作样品,你可以在
但是,请注意,上面的代码将无法处理可观察的属性。为了支持这两种方法,您需要检查它是否绑定到一个可观察对象,并且在这种情况下只使用普通可观察对象,如果它不是一个可观察对象,则使用
\u ko\u属性 如果您可以编辑您的问题并添加一个示例,并用最简单的示例描述问题,我会看一看,看看是否可以使用最简单的示例。是的,您已经编写了一个示例。然而,你的问题是关于一个击倒特定的东西,你的小提琴有五个外部库。jsfiddle上的示例展示的不仅仅是所需的最小值;这只不过是创建了一个简单的双向绑定和knockout。另外,您的示例没有讨论您在被告知\u双向绑定
标志后遇到的问题。尽管如此,我还是用一个示例更新了我的答案,为自定义的bindingHandler
设置了\u twoWayBindings
标志。感谢您的示例Robert..我已经修改了插件。现在可以更改nonobservable的值了。。