12

我有一个视图模型,其中包含一个 ko.observable 表示 div 的内容,如下所示:

function claimContainerViewModel(elem, api) {
    this.content = ko.observable('<somecontent>');
}

稍后,我使用 AJAX 调用更新该内容,并且我有一个具有以下绑定的 div:

<div id="ClaimContainer" data-bind="html: content">

为“内容”返回的 HTML 具有它自己的数据绑定,这就是问题所在:这些绑定都没有被解析。根据 Knockout 和我读过的所有资料,这应该会发生。当使用 'html' 绑定时,KO 应该足够聪明,可以重新绑定。

这是 KO 2.2.0 中的错误(我现在就卡住的版本),还是我误解了 html 绑定处理程序的工作原理?在有人问之前,在这种情况下没有 applyBindings 不起作用,因为容器使用 html 绑定,applyBindings 假设它应该自己处理重新绑定(我已经通过进入 KO 的代码确认了这一点)。

4

1 回答 1

19

更新:

这是我的自定义绑定的最终版本。这现在可以自动工作,不会双重绑定,并且就像“html”绑定一样工作,但更具动态性。

if (!ko.bindingHandlers['dynhtml']) {
    ko.bindingHandlers['dynhtml'] = {
        'init': function() {
            return { 'controlsDescendantBindings': true };
        },
        'update': function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            ko.utils.setHtml(element, valueAccessor());
            ko.applyBindingsToDescendants(bindingContext, element);
        }
    };
}

请注意,如果您不知道 HTML 的来源,这可能是不安全的。非常非常不安全。如果未经处理的用户输入可以进入您的 HTML,这可能是一个巨大的安全漏洞,因此请注意跨站点脚本攻击。

于 2013-07-19T22:59:24.020 回答