javascript - 渲染动态 Enyo 中继器

标签 javascript enyo

我需要为我正在从事的 enyo 项目制作一个数据表,该项目最终将显示 Ajax 调用的结果。 This (公然从 ryanjduffy here 窃取)似乎是一个很好的起点,但是当我尝试从按钮事件(而不是在构造函数中)调用 setData() 时,我有 here我收到以下错误:

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() 。 Here is the original working version将 render() 注释掉。一切看起来都很棒。但是,如果我尝试从 version that requires a button click 中删除 render() ,中继器开始在表格上方创建 div,而不是在表格内部创建 tr td...

编辑2:

基本上,据我所知,一旦表格被渲染(或类似的东西),表格内的中继器就会失去它的父级。结果是 Repeater 将开始在原始表格之外渲染其新项目,并且因为没有 tabletd 标记没有任何意义,它只是渲染一个 div 。 我想出的解决方案是给 Repeater 本身一个 table 标签,这样它的子项总是会出现在正确的位置。这增加了每次都需要重新创建标题行的挑战,但这并不是什么大问题。 I have a working example如果有人感兴趣的话。

最佳答案

我确信您不再寻找解决方案,但由于帖子中提到了我,我想我应该让您知道我的想法。简而言之,我的代码不应该起作用,但由于浏览器是宽容的,所以它确实起作用了......有点。

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

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

浏览器查看后说:“嘿,傻瓜! <div> 中没有 <table> ”,然后将其踢出,但留下 <tr> 。 s。

在您的示例中,由于您延迟了行的渲染,Enyo 渲染:

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

浏览器弹出 <div>然后你就剩下一张空 table 了。当您稍后设置数据时,这些行将呈现到 div 中。不幸的是,由于您正在渲染 <tr><td> ,这些在表格外无效,因此您只能获取文本。

我找到了几个解决方案。最简单的是设置 tag中继器的值为 TBODY,这在表内是允许的。稍微复杂一点的解决方案是让 DataTable 继承 Repeater 并将标题行设置为 chrome,这样在更新数据时它们就不会被删除。

Option #2 Fiddle

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;
    }
});

关于javascript - 渲染动态 Enyo 中继器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22364941/

相关文章:

javascript - FB.logout() 不适用于 Angular/ionic 3

javascript - 使用 jquery 列出页面上连接的所有 javascript 事件

javascript - 我如何访问 SOAP 响应属性?

javascript - 如何知道 enyo 组件的 'kind'?

javascript - 声明没有值的变量

javascript - Mongoose 找到很多并更新所有

javascript - 事件传播、覆盖和拖放事件

javascript - 允许 Enyo 中的工具提示包含 HTML 内容

Javascript 将 SQL 结果绑定(bind)到一个函数

javascript - Canvas 中的颜色到灰度转换