目前,我使用的是剔除2.1.0,在这种情况下,下面的数据交换绑定非常适合不可观测的value.When,我已经更新了剔除3.0,它不起作用。
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()._ko_property_writers是未定义的.because,我无法更新不可观测的值。
JsFIddle
有人能给我建议3.0版本的上述代码的解决方案吗?
通过使用下面的示例,我修改了我的自定义绑定,它运行得很好,.Please找到了更新的小提琴
更新Fiddle
发布于 2014-04-12 13:25:57
问题是,_ko_property_writers是一个私有实现细节(这就是为什么名称以_作为前缀)。如果您阅读源代码中第188-195行,用于在“敲除”中重写表达式,您将看到它声明如下:
从长远来看,将绑定明确声明为“双向”并不理想(如果所有绑定都可以使用官方的'property‘API而不需要声明它们可能使用的API,则会更好。)但是,由于这不是,而且从来都不是公共API (_ko_property_writers从未被记录在案),因此在短期内可以接受它作为内部实现细节。 对于那些在定制绑定中依赖_ko_property_writers的开发人员,我们将_twoWayBindings公开为一个无文档的特性,使升级到KO3.0相对容易。然而,这仍然不是一个官方的公共API,如果我们创建一个真正的公共属性编写器API,我们保留随时删除它的权利。
因此,似乎仍然没有一个公共API不会更改到未来的版本,但您应该能够使用_twoWayBindings,直到这样一个API被确定和提供。
更新2014-04-15 -添加一个设置双向绑定标志的示例
不幸的是,_twoWayBindings设置(它可能会在任何未来版本中消失,因为它不是真正的公共API )是您在创建bindingHandler时可以设置的一个标志,用于告诉_ko_property_writers为您的bindingHandler创建_ko_property_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);
});
}
};我有一个工作样本,你可以在http://jsfiddle.net/p8ugz/找到
但是,请注意,上面的代码不适用于可观察的属性。为了支持这两种方法,您需要检查它是否绑定到可观测的范围内,并且在这种情况下只使用普通的可观测值,如果它不是可观测的,则只需要与_ko_property_writers一起工作。
https://stackoverflow.com/questions/22991814
复制相似问题