敲除绑定处理程序拆卸功能

Knockout binding handler teardown function?

本文关键字:功能 程序 处理 绑定      更新时间:2023-09-26

我有一个使用plupload进行拖放和ajax上传的淘汰绑定处理程序。

为了使用 plupload 脚本,我创建了一个 plupload 实例,该实例又将事件侦听器绑定到 DOM 元素。

这工作正常。

但是,我

有一个"文件夹"列表,当我单击一个文件夹时,我会显示该文件夹中的文件列表。我通过使用foreach绑定selectedFolder().documents来重用相同的DOM元素。

我遇到的问题是,在我的绑定处理程序中,我在 init 函数中执行所有 plupload 操作,并且由于我重用了 DOM 元素,因此它们会绑定到多个事件处理程序。这会导致拖放事件发送到所有处理程序。这意味着,如果我将文件放在渲染的文件列表中,则 drop 事件也会在所有以前渲染的文件列表中触发。

正在寻找的是绑定处理程序中的某种拆解或清理函数,以便每当文件列表未呈现时,我就可以注销所有事件(这是一个词吗?

也许我们无法检测到未渲染?那么我将如何处理这个问题?我宁愿不要有一个全局实例,因为这会阻止我同时在多个地方使用绑定。

很抱歉没有给你任何代码。我正在使用手机自动取款机。

干杯!

您可以注册一个处理程序,该处理程序将在 KO 删除元素时执行(例如重新渲染模板时)。 它看起来像:

    //handle disposal (if KO removes by the template binding)
    ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
        $(element).datepicker("destroy");
    });

因此,在您的"init"函数中,您将为正在绑定的元素注册一个 dispose 回调,并且您将有机会运行您想要的任何清理代码。

我相信

这里提供的解决方案只有在 Knockout 是删除 DOM 节点的那个时才有效(即当它重新调整模板时)。 我很难让它在某些条件下触发。 在某些情况下,无论元素是如何删除的,您都需要执行回调;无论是使用 Knockout,还是通过 jQuery.html() 等(尤其是在单页应用程序中)。

我在jQuery的帮助下酝酿了一种不同的方法来添加这样的钩子。 使用特殊事件 API(此处有很好的描述),您可以添加一个方法,该方法在从 DOM 节点中删除特定事件时执行(拆卸时发生的情况)。

如果你将 Knockout 与 jQuery 结合使用,你可以将其包装到一个 Knockout 绑定中,如下所示:

ko.bindingHandlers.unload = {
    init: function (element, valueAccessor) {
        var eventName = 'your_unique_unLoad_event'; // Make sure this name does not collide
        if (!$.event.special[eventName]) {
            $.event.special[eventName] = {
                remove: function (o) {
                    o.data.onUnload()
                }
            };
        }
        $(element).on(eventName, { onUnload: valueAccessor()}, $.noop);
    }
};

然后,您可以在任何元素上使用它,如下所示:

<div id="withViewModelMethod" data-bind="unload: aMethodOnMyViewModel" />
<div id="withInLineMethod" data-bind="unload: function() { /* ... */ }" />

我欠这个SO帖子的功劳。