Dart 如何将事件侦听器添加到动态元素?
我有以下HTML:Dart 如何将事件侦听器添加到动态元素?,dart,dartium,Dart,Dartium,我有以下HTML: <table> <thead> <tr> <th>Id</th> <th>Name</th> <th>Description</th> <th>Actions</th> </tr> </
<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与否(但它确实有效)。我发现这样做的另一个好处是,如果我通过其他操作不断添加新行,我不需要不断向每一新行添加新的事件侦听器,如果重新加载表,我也不需要担心删除/重新添加事件侦听器以防止重复的事件侦听器。我很高兴你能