【问题标题】:How to pass object reference to an event handler within a dart polymer element如何将对象引用传递给飞镖聚合物元素中的事件处理程序
【发布时间】:2013-10-20 13:40:32
【问题描述】:

我可以将字符串属性和对象引用传递给事件处理程序吗?

来自https://github.com/sethladd/dart-polymer-dart-examples 的 gwt_contacts 示例:

contacts_view.html:

<div id="contact-list">
  <template repeat="{{contacts}}">
    <div>
      <input type="checkbox">
      <span on-click="selectContact" data-id="{{id}}">{{name}}</span>
    </div>
  </template>
</div>

contacts_view.dart 中的处理程序

void selectContact(MouseEvent event, var detail, SpanElement target) {
  String id = target.attributes["data-id"];
  selectedContact = contacts.firstWhere((Contact contact) => contact.id == id);
}

如何传递联系人参考而不是 ID?

类似问题:How do I pass arbitrary data to a click event handler function from a Dart polymer web component

更改:

在 Christophe Herreman 的提示下,我添加了一个新元素:

html:

<polymer-element name="contact-view-item">
  <template>
    <span on-click="select">{{contact.name}}</span>
  </template>
</polymer-element>

飞镖:

@CustomTag("contact-view-item")
class ContactViewItem extends PolymerElement {
  @observable @published Contact contact;

  void select(MouseEvent event, var detail, var target) {
    dispatchEvent(new CustomEvent("contactselected", detail: contact));
  }
}

并将列表更改为:

<div id="contact-list">
  <template repeat="{{contact in contacts}}">
    <div>
      <input type="checkbox">
      <contact-view-item contact="{{contact}}" on-contactselected="contactSelectedHandler"></contact-view-item>
    </div>
  </template>
</div>

并将处理程序添加到 ContactsView:

void contactSelectedHandler(CustomEvent event) {
  selectedContact = event.detail;
}

但是调度自定义事件会抛出错误:

Uncaught Error: unsupported object type for conversion
Exception: unsupported object type for conversion
undefined (undefined:0:0)

连接似乎很好,因为如果我不将联系人作为详细信息传递,则将调用contactSelectedHandler,但详细信息 - 当然 - 为空。

【问题讨论】:

    标签: dart dart-polymer


    【解决方案1】:

    我认为这在 HTML 定义中是不可能的。当您从元素类分派对象时,您可以在CustomEventdetail 属性中分派对象。注意detail 属性实际上只是对event.detail 的引用,当事件是CustomEvent 时。如果不是,detail 属性为空。

    组件定义

    <div id="contact-list">
      <template repeat="{{contacts}}">
        <div>
          <input type="checkbox">
          <span on-click="contact_clickHandler" data-id="{{id}}">{{name}}</span>
        </div>
      </template>
    </div>
    
    void contact_clickHandler(MouseEvent event, var detail, SpanElement target) {
      String id = target.attributes["data-id"];
      Contact contact = contacts.firstWhere((Contact c) => c.id == id);
      dispatchEvent(new CustomEvent("contactselected", detail: selectedContact));
    }
    

    组件使用

    <contact-list on-contactselected="contactList_contactSelectedHandler"></contact-list>
    
    void contactList_contactSelectedHandler(CustomEvent event) {
      var contact = event.detail;
      // do something with selected contact
    }
    

    【讨论】:

    • 我想到了一个解决方案,创建一个“子”聚合物元素,将对象作为属性传递,并使用该对象将事件传播给父级。你的意思是这样的解决方案吗?但我不知道如何正确地实现这个
    • 我只会调度包含从元素类中选择的联系人的自定义事件。然后,使用该组件的视图可以简单地侦听自定义事件并从事件详细信息中获取联系人。我在答案中添加了一个代码示例。
    • 更改了问题 - 请参见上文
    • 似乎有一个未解决的问题:code.google.com/p/dart/issues/detail?id=11192
    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2014-04-24
    相关资源
    最近更新 更多