敲除绑定处理程序拆卸功能
Knockout binding handler teardown function?
我有一个使用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帖子的功劳。
- Highcharts:格式化程序和点击功能don'不能使用Angular
- 如何使用onDeviceReady设置AngularJS应用程序并初始化Cordova的功能
- 网络驱动程序中使用的向下滚动功能从网页的哪个部分进行搜索
- angular应用程序中的浏览器功能检测:使用服务、指令、控制器
- 使用多功能框在 chrome 扩展程序中包含内联自动填充功能的任何方法
- 在浏览器上显示实习运行程序功能测试的结果
- 节点应用程序无法识别功能
- Chrome 扩展程序.在弹出菜单中分配具有功能的按钮
- 地理位置不适用于苹果移动网络应用程序功能
- 我无法在Meteor应用程序中使用聊天功能
- 如何在启用ES6功能的情况下运行Node.js应用程序
- 将事件处理程序放在HTML按钮上,而不覆盖其默认功能
- 谷歌应用程序脚本搜索UI下一个和上一个功能
- Wordpress自定义程序具有页面编辑功能
- 如何限制Facebook应用程序中的投票功能,每天一次
- 是否有任何twitter功能用于登录应用程序
- 我想构建一个代码,在谷歌应用程序脚本中检查我在Gmail中导入的邮件,我该如何找到这个功能
- SAPUI5 - 格式化程序功能不起作用
- 使用 firebase 获取$add angular 应用程序不是一个功能
- 设置超时功能在 chrome 扩展程序弹出窗口.js问题