【问题标题】:What signature is required for an event handler in Polymer.dart 1.0.0-rcxPolymer.dart 1.0.0-rcx 中的事件处理程序需要什么签名
【发布时间】:2015-12-19 01:34:56
【问题描述】:

<child-element> 触发类似的事件

fire('spoken', detail: {'message': this.$['myInput'].value});

<parent-element> 处理事件就像

<div on-spoken="heard">
  <child-element></child-element>
  <div>{{message}}</div>
</div>

// @eventHandler <= 1.0.0-rc.1
@reflectable
void heard(Event e) {
  set('message', 'heard: ' + e.detail['message']);
}

这会导致

参数不匹配的闭包调用:函数'call'

NoSuchMethodError:传递给名为“call”的方法的参数数量不正确 接收者:关闭:(事件)=> 来自函数“听到”的无效:。 尝试调用:调用('CustomEventWrapper'的实例,_LinkedHashMap len:1)

【问题讨论】:

    标签: dart dart-polymer


    【解决方案1】:

    事件处理程序应该有这个签名

    // @eventHandler <= 1.0.0-rc.1
    @reflectable
    void heard(Event e, var detail) {
      set('message', 'heard: ' + detail['message']);
    }
    

    为了更方便您还想直接从代码调用事件处理程序并且不使用处理程序内部的参数的情况,您可以将一个或两个参数设为可选。

    @reflectable
    void heard(Event e, [_]) {
      set('message', 'heard');
    }
    

    @reflectable
    void heard([_, __]) {
      // do something
    }
    

    【讨论】:

    • 这样做的原因是,在旧版本的 Polymer 中,我们允许您在方法签名中省略您未使用的参数。这是smoke 库的一个功能,但现在用于反射的reflectable 库不提供此功能。我们可以在聚合物方面添加一个解决方法,并且可能会在某个时候,但它没有还没有完成。
    • 我觉得没问题。花了一段时间才弄清楚它应该如何使用并发现 SO q+a 是一种在需要时记下我在哪里找到它的好方法 ;-)
    • 我确实觉得这个 CustomEventWrapper 很烦人!事件处理程序签名与 0.5 相比发生了很大变化,迁移指南中没有提及。如果需要一个 KeyboardEvent,您就不会将该类型放入签名中。现在你必须做 KeyboardEvent e = ev.original;如果您想让 lint 和 WebStorm 满意,那么“CustomEventWrapper ev”就在签名中。如果没有一个好的调试器,您几乎会迷失方向,甚至无法再编写事件处理程序!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    相关资源
    最近更新 更多