Jquery ui 敲除和JQueryUI绑定不调用更新回调
使用自定义绑定创建foreach绑定时,将新元素推送到视图模型时不会调用“update:”回调。 但是,正在创建新的跨度(不是手风琴)项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
<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');
});
}
};