如何在动态添加的内容中绑定 knockout.js 中的事件?

Posted

技术标签:

【中文标题】如何在动态添加的内容中绑定 knockout.js 中的事件?【英文标题】:How to bind event in knockout.js in dynamically added content? 【发布时间】:2014-06-13 23:54:26 【问题描述】:

我想在数据绑定后添加一些内容到我的页面,例如:

 $("<li>
       <div>text</div>
       <div  data-bind='event:  click: selectContact '></div>
    </li>")
     .appendTo($("#userClientGroup")
     .find("#searched-client-ul-UCG"));

但是,在这种情况下,点击事件不起作用;谁能给我解决方案?

【问题讨论】:

你为什么要动态添加这个?我的印象是您试图解决问题的症状,而不是问题本身。 好吧,如果你在绑定之后添加内容,它确实不会绑定到那个内容 @Smeegs 我要根据用户搜索添加内容 @sroes 是我想要解决的问题 不,你可以更新模型,只要它是一个可观察的。但是一旦容器已经有绑定,你就不能重新绑定。 【参考方案1】:

你可以使用ko.applybindings(viewModel, $('#yourNewElement'))。注意不要尝试绑定已经绑定的元素,否则会报错。

【讨论】:

【参考方案2】:

最好的方法是避免使用 jQuery(或任何 DOM 方法)来附加新元素,以避免将视图模型绑定到这些元素。您可以使用 html 中的现有绑定或自定义绑定或组合来解决问题。您的绑定应该处理 DOM 操作,而不是您的其他代码(不需要了解 DOM)。

另一种方法是使用委托事件处理程序。我使用以下自定义绑定:

ko.bindingHandlers.delegatedEvent = 
    init: function (element, valueAccessor) 
        var options = ko.unwrap(valueAccessor()) || ,
            setupEventHandler = function (settings) 
                if (settings.data) 
                    $(element).on(settings.event, settings.target, settings.data, settings.handler);
                 else 
                    $(element).on(settings.event, settings.target, settings.handler);
                

                ko.utils.domNodeDisposal.addDisposeCallback(element, function () 
                    $(element).off(settings.event, settings.target, settings.handler);
                );
            ;

        if ($.isArray(options)) 
            $.each(options, function () 
                setupEventHandler(this);
            );
         else 
            setupEventHandler(options);
        
    
;

&lt;ul&gt; 上使用它,您将li 插入如下:

<ul data-bind="delegatedEvent:  event: click, target: '.contact-select', handler: selectContact ">

在原始插入代码中添加类,并删除那里的数据绑定。

$('<li><div>text</div><div class="contact-select"></div></li>')
 .appendTo($("#userClientGroup").find("#searched-client-ul-UCG"));

您不仅解决了问题,而且还用一个可能替换了许多事件处理程序。

【讨论】:

以上是关于如何在动态添加的内容中绑定 knockout.js 中的事件?的主要内容,如果未能解决你的问题,请参考以下文章

访问 Javascript Html 模板并使用 Knockout.js 绑定数据

在 Knockout js 中动态 URL 绑定到 iframe

有条件地在 knockout.js 中添加元素属性

Knockout.JS如何绑定dom元素绑定

如何使用 Knockout.js 将多个 View 绑定到单个 ViewModel

在 Knockout.js 中异步应用绑定