Knockout手风琴绑定打破了

Ben*_*son 3 javascript binding jquery-ui knockout.js

以下绑定在1.9之前有效:

ko.bindingHandlers.accordion = {
    init: function(element, valueAccessor) {
        var options = valueAccessor() || {};
        setTimeout(function() {
            $(element).accordion(options);
        }, 0);
        ko.utils.domNodeDisposal.addDisposeCallback(element, function(){
            $(element).accordion("destroy");
        });
    },
    update: function(element, valueAccessor) {
        var options = valueAccessor() || {};
        $(element).accordion("destroy").accordion(options);
    }
}
Run Code Online (Sandbox Code Playgroud)

但自1.9以来,它不再有效,并给出以下错误:

Uncaught Error: cannot call methods on accordion prior to initialization; attempted to call method 'destroy'
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚原因.我查看了jQuery UI升级说明,但似乎没什么关系.

造成这种情况的原因是什么,我的绑定需要改变什么?

Gau*_*rav 8

未捕获错误:在初始化之前无法调用accordion上的方法; 试图调用方法'destroy'

此错误表示您destroy在初始化窗口小部件之前调用了accordion窗口小部件的方法.

问题在于您使用的自定义绑定代码setTimeOut.setTimeOut中的代码在更新函数之后运行.所以手风琴插件没有在你的元素上初始化,在你的更新函数中你正在调用destroy手风琴的方法.

一个简单的替代方案是你应该在调用任何方法之前检查手风琴插件是否在元素上初始化,例如:

if(typeof $(element).data("ui-accordion") != "undefined"){
 $(element).accordion("destroy").accordion(options);
}
Run Code Online (Sandbox Code Playgroud)

在这里你可以查看Working jsbin.

  • 有趣的是你把JS Bin称为小提琴:) (2认同)