Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.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虚拟元素动态创建html部件_Javascript_Jquery_Html_Knockout.js - Fatal编程技术网

Javascript 使用knockoutjs虚拟元素动态创建html部件

Javascript 使用knockoutjs虚拟元素动态创建html部件,javascript,jquery,html,knockout.js,Javascript,Jquery,Html,Knockout.js,我正在尝试使用带有html绑定的“virtual element”动态创建html部件,但失败的消息是:“绑定'html'不能用于虚拟元素”。以下是JSFIDLE: 有人知道是否有解决方法吗?您也可以将此作为您的视图: <div data-bind="html: html"></div>​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​ 这将用您提供的html属性替换div“container”的innerHtml。好吧,在玩了一些

我正在尝试使用带有html绑定的“virtual element”动态创建html部件,但失败的消息是:“绑定'html'不能用于虚拟元素”。以下是JSFIDLE:


有人知道是否有解决方法吗?

您也可以将此作为您的视图:

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

这将用您提供的html属性替换div“container”的innerHtml。

好吧,在玩了一些knockout之后,我发现这是可能的

工作示例如下

不幸的是,这需要复制一些内部淘汰功能

更新 KnockoutJS 2.2.1添加了绑定到导出的虚拟元素,因此即使在小型版本中也可以使用:

ko.exportSymbol('virtualElements.allowedBindings', ko.virtualElements.allowedBindings);

这意味着更好的html绑定解决方案是可能的-请参阅。

基于Artem的代码和KnockoutJS 2.2.1,这里有一个改进版本:

ko.exportSymbol('virtualElements.allowedBindings', ko.virtualElements.allowedBindings);

改进:

  • 更少的代码,更少的重复(与公开的接口挂钩)
  • 覆盖“html”绑定,因此基本上旧的“html”现在可以在虚拟环境中使用
  • 不再有全局函数
  • 这是密码

    {
        var overridden = ko.bindingHandlers['html'].update;
    
        ko.bindingHandlers['html'].update = function (element, valueAccessor) {
            if (element.nodeType === 8) {
                var html = ko.utils.unwrapObservable(valueAccessor());
    
                ko.virtualElements.emptyNode(element);
                if ((html !== null) && (html !== undefined)) {
                    if (typeof html !== 'string') {
                        html = html.toString();
                    }
    
                    var parsedNodes = ko.utils.parseHtmlFragment(html);
                    if (parsedNodes) {
                       var endCommentNode = element.nextSibling;
                       for (var i = 0, j = parsedNodes.length; i < j; i++)
                          endCommentNode.parentNode.insertBefore(parsedNodes[i], endCommentNode);
                    }
                }
            } else { // plain node
                overridden(element, valueAccessor);
            }
        };
    }
    ko.virtualElements.allowedBindings['html'] = true;
    
    {
    var overrided=ko.bindingHandlers['html'].update;
    ko.bindingHandlers['html'].update=函数(元素,valueAccessor){
    if(element.nodeType==8){
    var html=ko.utils.unwrapobbservable(valueAccessor());
    空节点(元素);
    if((html!==null)&&(html!==undefined)){
    如果(html的类型!=='string'){
    html=html.toString();
    }
    var parsedNodes=ko.utils.parseHtmlFragment(html);
    if(解析的节点){
    var endCommentNode=element.nextSibling;
    for(var i=0,j=parsedNodes.length;i
    我知道如何对现有元素使用html绑定。我的问题是我想动态地创建元素本身。i、 e.我不想为div或其他任何东西绑定内部html内容,我希望html内容到位。你是说你想使用模板html替换DOM中的节点,并且当前的
    模板
    绑定将不起作用,因为它们只替换其子节点,而不替换自身?酷,这正是我想要的。我只是想看看html和vhtml绑定是否可以递归地应用ko绑定,但我发现它不能:仅供参考,KnockoutJS2.2.1允许消除大部分重复。检查我的代码+演示的答案。这解决了我试图在淘汰模板中显示HTML字段的问题。谢谢