Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery ko.bindingHandlers.datepicker不适用于淘汰版3.0_Jquery_Knockout.js_Datepicker_Knockout 2.0_Knockout 3.0 - Fatal编程技术网

Jquery ko.bindingHandlers.datepicker不适用于淘汰版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

目前我正在使用knockout 2.1.0,其中以下datepicker绑定对于不可观察的值非常有效。当我更新knockout 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()。\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的值了。。