我在我的代码中使用的KnockoutObservables
不属于viewModel,只是因为我喜欢听他们的状态。
然而,当我处置与它们相关的HtmlElement
时,我需要处理它们(我假设)以清除记忆。
ko.cleanNode
我假设从data-bind
中的节点清除订阅,这不完全是我所拥有的。
<div id="foo" data-bind="myCustomBinding: foo"></div>
自定义绑定:
ko.bindingHandlers.myCustomBinding = {
init: function (element: any, valueAccessor: () => any, allBindingsAccessor: () => any, viewModel: any, bindingContext: KnockoutBindingContext) {
new FooClass($(element), valueAccessor());
}
}
MyFooClass
然后根据需要显示并创建许多新的KnockoutObservables
作为公共属性。我创建的其他对象可以使用这些。我假设ko.cleanNode
没有处理这个,所以我该如何清理它们呢?
class FooClass {
disposed: boolean = false;
myInternalObservable: KnockoutObservable<any> = ko.observable("test");
constructor(public htmlElement: JQuery, public value: KnockoutObservable<any>) {
// Processing
}
dispose(): void {
if (this.disposed) {
return;
}
// Do other disposing, unbind events, delete data
// Dispose the ko?
this.disposed = true;
}
}
由于
答案 0 :(得分:1)
您可以使用的一件事是ko.utils.domNodeDisposal.addDisposeCallback(element, cleanUpFunction)
。这允许您在Knockout删除元素时执行代码(如模板化或控制流绑定)。 Knockout此时已经将ko.cleanNode
作为ko.removeNode
的一部分进行调用,因此它允许您进行任何额外的清理。您可以选择在计算的observables上调用dispose
并销毁您在自定义绑定中完成的任何小部件或其他内容。