0

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;
    }
}

谢谢

4

1 回答 1

1

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

于 2013-09-03T11:36:12.770 回答