首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ko.bindingHandlers.datepicker不适用于淘汰版3.0

ko.bindingHandlers.datepicker不适用于淘汰版3.0
EN

Stack Overflow用户
提问于 2014-04-10 15:02:11
回答 1查看 1.8K关注 0票数 0

目前,我使用的是剔除2.1.0,在这种情况下,下面的数据交换绑定非常适合不可观测的value.When,我已经更新了剔除3.0,它不起作用。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的方式:

代码语言:javascript
复制
ko.expressionRewriting._twoWayBindings['simpleTwoWayBinding'] = true;

一个绑定的完整示例,它将对不可观测的属性进行双向绑定:

代码语言:javascript
复制
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一起工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22991814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档