在自定义元素中访问子对象

时间:2019-06-02 01:11:00

标签: javascript custom-element

我正在创建一个扩展表单元格对象的自定义对象。 新的单元格对象包含一个输入文本框。

这是我的代码:

<html>
    <head>
    <script src="http://code.jquery.com/jquery-latest.js"></script>
    <script>
        //table
        class DataTable extends HTMLTableElement {
          constructor() {
            super()
            console.info('data-table created')
          }
        }       
        customElements.define('data-table', 
                            DataTable, 
                            {
                              extends: 'table'
                            });

        //cell 
        class DataCell extends  HTMLTableCellElement {
          connectedCallback() {
            console.info('cell connected')
            if (typeof this.renderContent === 'function')
              this.renderContent()
          }
          renderContent() {
            console.info('data-string render')
            this.textBox= document.createElement("input");
            this.textBox.type="text";
            this.appendChild(this.textBox); 

          }
          set value(v)
          {
            this.textBox.value=v;
          }
          get value()
          {
            return this.textBox.value;
          }
        }
        customElements.define('data-string', 
                            DataCell, 
                            {
                                extends: 'td'
                            });

        $( document ).ready(function(){
                var t=new DataTable();
                var row=t.insertRow(t.rows);
                var cell=new DataCell();

                row.appendChild(cell);
                cell.value="gfg";
                $(document.body).append(t);
            });
    </script>
    </head>
    <body>
        <h4>Test Table Extension v1</h4>

    </body>
</html>

我想在新单元格中添加一个“值”属性。 将值设置为文本框时,出现“无法设置未定义的属性'值'”。在“设置值(v)”功能中,“此”是指文档,而不是单元格,这就是问题所在。

1 个答案:

答案 0 :(得分:0)

您必须先创建textBox输入,然后才能使用.value访问它。当前,在您调用.value时尚未创建/分配。一个解决方案是在Cell的构造函数中创建input-element:

//table
class DataTable extends HTMLTableElement {
    constructor() {
        super();
        console.info('data-table created');
    }
}
customElements.define('data-table',
    DataTable, {
        extends: 'table'
    });

//cell 
class DataCell extends HTMLTableCellElement {
    constructor() {
        super();
        this.textBox = document.createElement("input");
        this.textBox.type = "text";
        console.info('data-cell created');
    }
    connectedCallback() {
        console.info('cell connected')
        if (typeof this.renderContent === 'function')
            this.renderContent()
    }
    renderContent() {
        console.info('data-string render')
        this.appendChild(this.textBox);

    }
    set value(v) {
        this.textBox.value = v;
    }
    get value() {
        return this.textBox.value;
    }
}
customElements.define('data-string',
    DataCell, {
        extends: 'td'
    });

$(document).ready(function() {
    var t = new DataTable();
    var row = t.insertRow(t.rows);
    var cell = new DataCell();

    row.appendChild(cell);
    cell.value = "gfg";
    $(document.body).append(t);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<h4>Test Table Extension v1</h4>