Dart 如何将事件侦听器添加到动态元素?

Dart 如何将事件侦听器添加到动态元素?,dart,dartium,Dart,Dartium,我有以下HTML: <table> <thead> <tr> <th>Id</th> <th>Name</th> <th>Description</th> <th>Actions</th> </tr> </

我有以下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元素
)是动态添加的,因此只有在执行添加行的方法后调用
wireUpEvents
时,上述代码才有效

是否有人知道语法或使用
DART
在元素中添加事件侦听器。单击.add()
以后动态添加元素时

我试着检查DART文档,但结果是空白的

如果我要使用jQuery,我可以使用类似于:

$("#order-items table")on("click", "tbody [data-action="edit"]", function(){...})
…但我只想使用DART编写示例应用程序

编辑
虽然
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
元素之前执行,并且在某个未知的后期加载
tr
元素之后仍然有效


我还发现它现在包括任何动态添加的行、预加载的行以及其他动态添加的新记录行等。

听起来您需要使用Dart的未来对象。约翰·埃文斯(John Evans)最近的一篇文章给出了极好的概述。我将尝试给出一个简单的示例:

假设我有一个叫做htmlInDart的类,我称之为:

void main(){
var htmlExample=new HtmlInDart().createStyles();
htmlExample
…然后((htmlExample)=>htmlExample.buildPage()
…然后((htmlExample)=>htmlExample.addListeners());
}
该类可能如下所示:

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']);
    });
  });
}
class-htmlInDart{
htmlInDart();
未来的CreateStypes(){
最终c=新的完成符();
//创建一些样式
c、 完成(本);
返回c.未来;
}
未来构建页(){
最终c=新的完成符();
//构建页面
c、 完成(本);
返回c.未来;
}
未来的addListeners(){
最终c=新的完成符();
//添加一些侦听器
c、 完成(本);
返回c.未来;
}

希望这能让您了解如何在您的案例中实现它。

听起来您需要使用Dart的未来对象。John Evans最近的一篇文章提供了一个极好的概述。我将尝试给出一个简单的示例:

假设我有一个叫做htmlInDart的类,我称之为:

void main(){
var htmlExample=new HtmlInDart().createStyles();
htmlExample
…然后((htmlExample)=>htmlExample.buildPage()
…然后((htmlExample)=>htmlExample.addListeners());
}
该类可能如下所示:

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']);
    });
  });
}
class-htmlInDart{
htmlInDart();
未来的CreateStypes(){
最终c=新的完成符();
//创建一些样式
c、 完成(本);
返回c.未来;
}
未来构建页(){
最终c=新的完成符();
//构建页面
c、 完成(本);
返回c.未来;
}
未来的addListeners(){
最终c=新的完成符();
//添加一些侦听器
c、 完成(本);
返回c.未来;
}

希望这能让您了解如何在您的案例中实现回调。

当您首先添加行时,有什么原因不能添加回调吗?例如:

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

    ...

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

当您首先添加行时,是否有任何原因不能添加回调?例如:

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

    ...

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

这看起来很有希望。今晚我会仔细阅读这篇文章并正确回答。我记得以前在可用的文档中遇到过
future
,但当时无法完全理解。在通读并在我的应用程序中玩过之后,我今晚会回复更新。Seth Ladd也对使用fut做了一次尝试Dart中的ures可能会有所帮助。在使用代码一段时间后,我还找到了另一个解决方案,这在语义上更接近于我所寻找的。我只是将其作为对我原始问题的编辑添加,但我不确定在Dart中这样做是否可以接受(尽管它确实有效)。我发现这样做的另一个好处是,如果我通过其他操作不断添加新行,我不需要不断向每一新行添加新的事件侦听器,并且如果重新加载表,我也不需要担心删除/重新添加事件侦听器以防止重复事件侦听器。我很高兴您提出了一个很好的解决方案。未来s对你的申请似乎有点过分。无论如何,谢谢你接受这个答案。你的答案似乎最适合使用DART功能,这就是为什么我认为这是一个好答案。如果我使用的解决方案实际上是我应该在DART中做的事情,我不确定。再次感谢你的时间和链接。你链接的两篇文章,如w由于DART文档的阅读非常有趣。这看起来很有希望。今晚我将仔细阅读这篇文章并正确回答。我记得以前在可用的文档中遇到过
future
,但当时无法理解它的全部内容。在阅读完之后,我将在今晚回复更新,并且在我的应用程序中进行了一次尝试。Seth Ladd也对在Dart中使用futures做了一次尝试,这可能会有所帮助。在对代码进行了一段时间的尝试后,我还找到了另一个解决方案,这在语义上更接近于我想要的。我只是将其作为对我原始问题的一个编辑添加,尽管我不确定这在DA中是否可以接受RT与否(但它确实有效)。我发现这样做的另一个好处是,如果我通过其他操作不断添加新行,我不需要不断向每一新行添加新的事件侦听器,如果重新加载表,我也不需要担心删除/重新添加事件侦听器以防止重复的事件侦听器。我很高兴你能