Jquery ui 敲除和JQueryUI绑定不调用更新回调

Jquery ui 敲除和JQueryUI绑定不调用更新回调,jquery-ui,knockout.js,Jquery Ui,Knockout.js,使用自定义绑定创建foreach绑定时,将新元素推送到视图模型时不会调用“update:”回调。 但是,正在创建新的跨度(不是手风琴)项 <div data-bind="foreach:items, koAccordion: {}"> <div> <span data-bind="text: id"></span> </div> <div> <span data-bind="text: name"></sp

使用自定义绑定创建foreach绑定时,将新元素推送到视图模型时不会调用“update:”回调。 但是,正在创建新的跨度(不是手风琴)项

<div data-bind="foreach:items, koAccordion: {}">
<div>
<span data-bind="text: id"></span>
</div>
<div>
<span data-bind="text: name"></span>
</div>
</div>
绑定的
update()
函数在其依赖项更改时被调用

这意味着您必须在
update()
的主体内触发knockout的依赖项跟踪。这通常是通过生成可观察对象的潜在值(换句话说,通过调用它)来实现的

通常,您也会在函数中使用该值,但在这种情况下,您只需要该步骤,以便依赖项跟踪注意到存在订户

这将有助于:


但实际上,您可以完全跳过
update
回调,而是使用显式订阅:

ko.bindingHandlers.koAccordion = {
    init: function (element, valueAccessor) {
        var items = valueAccessor(),
            subscription;

        $(element).accordion();

        // set up an explicit subscription
        subscription = items.subscribe(function () {
            $(element).accordion('refresh');
        });

        // properly destroy the widget when the element gets removed
        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
            subscription.dispose();
            $(element).accordion('destroy');
        });
    }
};


也就是说,有一个成熟的jQueryUI自定义绑定库,您应该使用它,而不是自己使用:

不要忘记查看淘汰版jQueryUI,它比我在这里写的要好得多。
ko.bindingHandlers.koAccordion = {
    init: function (element, valueAccessor) {
        $(element).accordion();

        // properly destroy the widget when the element gets removed
        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
            $(element).accordion('destroy');
        });
    },
    update: function (element, valueAccessor) {
        // unwrap the observable: this registers an implicit subscription
        ko.unwrap(valueAccessor());
        $(element).accordion('refresh');
    }
};
ko.bindingHandlers.koAccordion = {
    init: function (element, valueAccessor) {
        var items = valueAccessor(),
            subscription;

        $(element).accordion();

        // set up an explicit subscription
        subscription = items.subscribe(function () {
            $(element).accordion('refresh');
        });

        // properly destroy the widget when the element gets removed
        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
            subscription.dispose();
            $(element).accordion('destroy');
        });
    }
};