Javascript 渲染动态Enyo中继器

Javascript 渲染动态Enyo中继器,javascript,enyo,Javascript,Enyo,我需要为我正在处理的enyo项目创建一个数据表,最终显示Ajax调用的结果。 (显然是从ryanjduffy偷来的)似乎是一个很好的起点,但当我尝试从按钮事件(而不是在构造函数中)调用setData()时,我得到了以下错误: InvalidCharacterError: String contains an invalid character @ http://enyojs.com/enyo-2.1/enyo/source/dom/Control.js:681 我查看了Control.js代码

我需要为我正在处理的enyo项目创建一个数据表,最终显示Ajax调用的结果。 (显然是从ryanjduffy偷来的)似乎是一个很好的起点,但当我尝试从按钮事件(而不是在构造函数中)调用setData()时,我得到了以下错误:

InvalidCharacterError: String contains an invalid character @ http://enyojs.com/enyo-2.1/enyo/source/dom/Control.js:681
我查看了Control.js代码,它似乎试图创建一个新节点,但是
this.tag
属性被设置为
null
,结果出现了问题

我觉得我错过了一些非常简单的东西,但我只是看不出问题所在

有人能告诉我我做错了什么吗

谢谢

编辑1:

显然不需要调用render()。将render()注释掉。一切看起来都很好。但是,如果我尝试从中删除render(),中继器将开始在表上方创建
div
,而不是在表内部创建
tr td

编辑2:

基本上,据我所知,一旦呈现了表(或类似的东西),表中的中继器就会失去它的父级。结果是,中继器将开始在原始表之外呈现其新项目,因为没有
表的
td
标记没有意义,它只呈现
div

我提出的解决方案是给中继器本身加上一个
标签,这样它的子项总是在正确的位置结束。这增加了每次需要重新创建标题行的挑战,但这并不是什么大问题。如果有人感兴趣的话。

我肯定你不再寻找解决方案了,但因为在帖子中提到了我,我想我会让你知道我的想法。简言之,我的代码不应该工作,但因为浏览器是宽容的,它做到了。。。有点

当代码在创建时运行时,它呈现如下内容:

<table>
  <tr> <!-- header row --> </tr>
  <div> <!-- repeater tag -->
     <tr> <!-- repeater row --> </tr>
  </div>
</table>

我已经把这个问题转发给核心团队去看一看。我想他们正忙着为候选版本添加标签,所以回答这个问题可能需要一些时间。非常感谢!与此同时,我一直在研究其他解决方案,但我仍然对答案感兴趣。我觉得我对控件是如何创建的肯定有一些基本的误解。谢谢你的解释。在大量的实验和花费时间打开element inspector之后,我或多或少得出了相同的结论,但有点模糊。我的解决方案是将中继器的标签设置为
Table
,而不是
TableBody
,但我认为这不会有多大区别。再次感谢!
<table>
  <tr> <!-- header row --> </tr>
  <div></div>
</table>
enyo.kind({
    name:"DataTable",
    tag: "table",
    kind: "Repeater",
    published:{
        map:0,
        data:0
    },
    handlers: {
        onSetupItem: "setupItem"
    },
    components:[
        {name:"row", kind:"DataRow"}
    ],
    create:function() {
        this.inherited(arguments);
        this.mapChanged = this.dataChanged = enyo.bind(this, "refresh");

        this.refresh();
    },
    refresh:function() {
        if(this.map && this.data) {
            this.buildHeader();
            this.setCount(this.data.length);
        }
    },
    buildHeader:function() {
        if(this.$.header) {
            this.$.header.destroyClientControls();
        } else {
            this.createComponent({name:"header", tag:"tr", isChrome: true});
        }

        for(var i=0;i<this.map.length;i++) {
            this.$.header.createComponent({content:this.map[i].header, tag:"th"});
        }

        this.$.header.render();
    },
    setupItem:function(source, event) {
        for(var i=0;i<this.map.length;i++) {
            event.item.$.row.createComponent({content:this.data[event.index][this.map[i].field]});
        }

        event.item.render();

        return true;
    }
});