敲除.js - "html"绑定内的"value"绑定



我正在开发一个需要根据某些值动态生成HTML的应用程序。我有以下代码,我希望动态 HTML 去哪里:

<div data-bind="html: extraHTML"></div>

我的 javascript 文件中有一个对象设置,其中包含各种 HTML 代码块,一旦应用程序启动,就会选择这些代码块。例如,其中一个对象包含以下内容:

{ type: 'Int', html: '<input style='margin: 0'type='number' min='0' data-bind='value: selectedExtra, valueUpdate: 'input'' />' }

当我运行应用程序时,我没有收到任何错误,并且 HTML 已正确绑定,但是,当我在输入字段中插入值时,可观察到的"selectedExtra"不会更新。当我将包含"html"绑定的div 标签替换为以下内容时:

<input style="margin: 0" type="number" min="0" data-bind="value: selectedExtra, valueUpdate: 'input'">

可观察的更新可以做到这一点。我想知道的是,是否无论如何都可以在"html"绑定中动态分配"值"绑定并实际更新值。也许我错过了另一个解决方案?

任何帮助将不胜感激,谢谢!

更新

我创建了一个 jsfiddle 来演示这里的问题。

当你调用applyBindings时,ko遍历dom节点以"绑定"到元素。你的 html 是生成的,所以 ko.applyBindings 永远不会为这些元素调用。

您有 2 个选项:- 使用韦恩评论的模板,(推荐)- 如果您确实想从可观察量生成 html 并绑定 ViewModel,则可以使用自定义绑定。您实际上正在在此处创建一些自定义模板系统。

.html:

<div data-bind="htmlTemplate:html"></div>

绑定处理程序:

ko.bindingHandlers.htmlTemplate = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
       // NOTE: you could return false and ommit the update code, it probably works, but this way you have more control what happens when the html is updated
       return { controlsDescendantBindings:true };
    },
    update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        // remove old bindings
        ko.cleanNode(element);
        // update the inner html, unrwap to support observables and/or normal properties            
        element.innerHTML=ko.unwrap(valueAccessor());
        // apply the view model to the content of the element
        ko.applyBindingsToDescendants(viewModel,element);
    }
};

JSFIDDLE:http://jsfiddle.net/martijn/6b87vw3L/

最新更新