Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从更改的模板中删除knockoutjs事件处理程序_Javascript_Templates_Knockout.js_Dom Events - Fatal编程技术网

Javascript 如何从更改的模板中删除knockoutjs事件处理程序

Javascript 如何从更改的模板中删除knockoutjs事件处理程序,javascript,templates,knockout.js,dom-events,Javascript,Templates,Knockout.js,Dom Events,我正在寻找如何从消失的UI模板中删除事件处理程序的方法 例如,我有一个带有模板绑定的元素 模板名称来自observable属性。设置有效名称后,单击“绑定/事件”按钮即可显示“模板渲染”按钮。当我传递undefined作为名称时,模板不会呈现任何内容 事件处理程序和绑定会发生什么变化 UPD:我头脑中的一些代码: <div data-bind="template: { name: templateName }"></div> <script type="text/

我正在寻找如何从消失的UI模板中删除事件处理程序的方法

例如,我有一个带有模板绑定的元素

模板名称来自observable属性。设置有效名称后,单击“绑定/事件”按钮即可显示“模板渲染”按钮。当我传递undefined作为名称时,模板不会呈现任何内容

事件处理程序和绑定会发生什么变化

UPD:我头脑中的一些代码:

<div data-bind="template: { name: templateName }"></div>

<script type="text/html" id="btn-tmpl">
    <button data-bind="click: $root.buttonClick">Click me</button>
</script>

<script>
    var vm = {
        templateName: ko.observable('btn-tmpl'),
        buttonClick: function(){ alert('clicked'); }
    };

    ko.applyBindings(vm);
</script>

这里有两种情况

templateName值以undefined开头。 templateName值以btn tmpl开头,并更改为未定义。 在第一种情况下,模板绑定不会简单地不呈现任何内容,因为没有名称。因此,DOM中没有按钮元素,也没有事件

在第二种情况下,当清除templateName时,KO将使用模板绑定清空div的内容,这包括清理所有事件处理程序


作为进一步说明,类型为text/html的脚本元素实际上并不是作为DOM节点由浏览器传递的。您将无法在DOM中找到该按钮元素,因此KO将不会连接事件处理程序

可能在名称未定义时禁用单击事件,即在单击事件函数中,执行e.PreventDefault。如果您的点击绑定是视图模型中的一个函数,那么通过computed observable>这应该很容易做到,这包括清理所有事件处理程序KO是如何做到的?不是确切的代码,而是想法。如果我将使用不引人注目的事件处理,例如$'button'。单击函数{vm.buttonClick};如何在删除模板时管理它?手动解除绑定jQ事件?如果使用jQuery手动绑定事件,则应自行解除绑定。但是你真的应该让knockout通过点击数据绑定来完成所有繁重的工作。使用ko.utils.domNodeDisposal.addDisposeCallback在ko移除单个元素并解除事件处理程序绑定时,将ko返回回调。