3

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 のアップグレード ノートを調べましたが、関連するものは何もありませんでした。

何が原因で、バインディングを変更する必要があるのでしょうか?

4

1 に答える 1

8

不明なエラー: 初期化の前にアコーディオンのメソッドを呼び出すことはできません。メソッド「destroy」を呼び出そうとしました

このエラーは、destroyウィジェットを初期化する前にアコーディオン ウィジェットのメソッドを呼び出していることを示しています。

問題は、使用するカスタム バインディング コードにありますsetTimeOut。setTimeOut 内のコードは、更新関数の後に実行されます。したがって、アコーディオン プラグインは要素に対して初期化されておらず、更新関数destroyでアコーディオンのメソッドを呼び出しています。

簡単な代替方法は、次のように、メソッドを呼び出す前に、要素に対してアコーディオン プラグインが初期化されているかどうかを確認することです。

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

ここでWorking jsbinを確認できます。

于 2013-03-28T03:50:13.953 に答える