Knockout手风琴绑定打破了

时间:2013-03-28 02:10:28

标签: javascript jquery-ui binding 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);
    }
}

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

Uncaught Error: cannot call methods on accordion prior to initialization; attempted to call method 'destroy'

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

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

1 个答案:

答案 0 :(得分:8)

  

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

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

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

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

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

您可以在此处查看Working jsbin