清理Knockout Observables

时间:2013-09-03 08:55:23

标签: knockout.js

我在我的代码中使用的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;
    }
}

由于

1 个答案:

答案 0 :(得分:1)

您可以使用的一件事是ko.utils.domNodeDisposal.addDisposeCallback(element, cleanUpFunction)。这允许您在Knockout删除元素时执行代码(如模板化或控制流绑定)。 Knockout此时已经将ko.cleanNode作为ko.removeNode的一部分进行调用,因此它允许您进行任何额外的清理。您可以选择在计算的observables上调用dispose并销毁您在自定义绑定中完成的任何小部件或其他内容。