代码之家  ›  专栏  ›  技术社区  ›  Svish

如何访问RiotJS中嵌套的每个循环中的项

  •  1
  • Svish  · 技术社区  · 6 年前

    使用RiotJS,我试图构建一个非常简单的可编辑表。我可以这样生成它:

    <table-editor>
      <table>
        <thead>
          <tr>
            <th each="{ name, key in opts.columns }">{ name }</th>
            <th>
              <button onclick="{ add }"><i class="ais ai-plus"></i></button>
            </th>
          </tr>
        </thead>
        <tbody>
          <tr each="{ item in opts.items }">
            <td each="{ name, key in opts.columns }">
              <input type="text" onchange="{ onChange }" value="{ item[key] }">
            </td>
            <td>
              <button onclick="{ remove }">Remove</button>
            </td>
          </tr>
        </tbody>
      </table>
    
      <script>
        this.add = function (): void {
          const newItem = Object
            .keys(this.opts.columns)
            .reduce((i, key) => { i[key] = ''; return i; }, {});
          this.opts.items.push(newItem);
        };
    
        this.remove = function (e: RiotEvent): void {
          const { item } = e;
          const index = this.opts.items.indexOf(item);
          this.opts.items.splice(index, 1);
        };
    
        this.onChange = function (e: RiotEvent): void {
          const { item } = e;
          console.error(item, ' is column, not item... 😟');
          const index = this.opts.items.indexOf(item);
          // TODO: Update the item
        };
      </script>
    </table-editor>
    

    问题是 e.item 它和 onChange 事件是列对象,而不是项对象。这是因为每个循环都是嵌套的,但是我该如何解决这个问题呢?当然没有 parent 在要“向上”的项目上,使用 parent.onChange 显然也没什么区别。。。

    如何获取项目以便在数组中更改它?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Svish    6 年前

    结果是,在这种特殊情况下,我可以通过简单地将onchange事件移到表行来解决它,如下所示:

    <tr each="{ item in opts.items }" onchange="{ onChange }">
      <td each="{ name, key in opts.columns }">
       <input type="text" name="{ key }" value="{ item[key] }">
      </td>
      <td>
        <button onclick="{ remove }">Remove</button>
      </td>
    </tr>
    

    然而,由于某些原因,我不明白,这样做的一个副作用是 e.item 是现在 e.item.item ... 意思是我的(完成) onChange 事件变成:

    this.onChange = function (e: RiotEvent): void {
      const { item: { item }, target: { name, value } } = e;
      const index = this.opts.items.indexOf(item);
    
      tag.opts.items[index][name] = value;
    };