如何向动态元素添加事件侦听器?

时间:2012-10-15 12:45:25

标签: dart dartium

我有以下HTML:

<table>
    <thead>
        <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Description</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <td>Item 1</td>
            <td>Description of Item 1</td>
            <td>
                <a href="#" data-action="edit" data-item-id="1">Edit</a>
                <a href="#" data-action="delete" data-item-id="1">Delete</a>
            </td>
        </tr>
        <tr>
            <td>2</td>
            <td>Item 2</td>
            <td>Description of Item 2</td>
            <td>
                <a href="#" data-action="edit" data-item-id="2">Edit</a>
                <a href="#" data-action="delete" data-item-id="2">Delete</a>
            </td>
        </tr>
    </tbody>
</table>

表格行(tr elements)已添加动态

我将点击事件连接到所有Edit链接,如下所示:

void wireUpTableEvents() {
  var editLinks = queryAll('#order-items table tbody [data-action="edit"]');

  editLinks.forEach((element) {
    element.on.click.add((event){
      print(element.attributes['data-item-id']);
    });
  });
}

如上所述,表格行(tr elements)是动态添加的,因此只有在我执行添加行的方法后调用wireUpEvents 后,上述代码才有效

在将来动态添加元素时,是否有人知道语法或使用DART的{​​{1}}向元素添加事件侦听器?

我尝试检查DART文档,但documentation on Event Listeners为空。

如果我要使用jQuery,我可能会使用类似的东西:

on.click.add()

...但我想仅使用DART编写示例应用程序。

修改
尽管$("#order-items table")on("click", "tbody [data-action="edit"]", function(){...}) 对于回调来说听起来很棒,但由于在我的场景中没有长时间运行的任务,因此我需要的东西似乎有些过分。

最接近我能够将我的事件监听器附加到静态元素但是处理未来子元素的单击事件是这样的:

future

上面的代码可以在加载任何实际的void wireUpTableEvents() { var tableBody = query('#order-items table tbody'); // Attach Event Listener to the static tbody, which always exists. tableBody.on.click.add((event) { var clickedElement = event.srcElement; var itemId = clickedElement.attributes['data-item-id']; // Check if the clicked element was either one of the edit links or one of the delete links. switch (clickedElement.attributes['data-action']) { case 'edit': // Replace print with calling a method to process edit request for this item. print('processing edit click from item with id: $itemId'); break; case 'delete': // Replace print with calling a method to process delete request for this item. print('processing delete click from item with id: $itemId'); break; } }); }​ 元素之前执行,并且在tr元素在某个未知的未知阶段加载后仍然有效。

我还发现它现在涵盖任何动态添加的行,预先加载的行以及其他动态添加的行以用于新记录等。

2 个答案:

答案 0 :(得分:4)

听起来你需要使用Dart的Future对象。 John Evans最近有一个post给出了一个很好的概述。我将尝试举一个简单的例子:

假设我有一个名为htmlInDart的类,我将其调用如下:

 
void main() {
  var htmlExample = new HtmlInDart().createStyles();
  htmlExample
      ..then((htmlExample) => htmlExample.buildPage())
      ..then((htmlExample) => htmlExample.addListeners());
}

该类可能如下所示:

class htmlInDart {

  htmlInDart();

  Future<htmlInDart> createStyles() {
    final c = new Completer();
    // create some styles
    c.complete(this);
    return c.future;
  }

  Future<htmlInDart> buildPage() {
    final c = new Completer();
    // build the page
    c.complete(this);
    return c.future;
  }

  Future<htmlInDart> addListeners() {
    final c = new Completer();
    // add some listeners
    c.complete(this);
    return c.future;
  }

希望这能让您了解如何根据您的情况实施它。

答案 1 :(得分:0)

在首先添加行时,是否有任何理由无法添加回调?类似的东西:

void addRow(TableElement table, ...) {
    TableRowElement item = new TableRowElement();

    ...

    table.nodes.add(item);
    item.on.click.add((callback) { });
}