在聚合物中发射自定义事件让我"Exception: Class 'MyData' has no instance method '[]'"


class MyData {
  String name;
  String age;
  MyData(this.name, this.age);
}
... 
class AlertSimulatorElement extends PolymerElement {
void handleClick(e,d,t) {
   asyncFire('polymer-signal',detail: new MyData("Mike",99));
   // this works:
   //asyncFire('polymer-signal', detail: {'name': "foo", 'data': "Foo!"});
   }
}

asynFire给了我:

Exception: Class 'MyData' has no instance method '[]'.
NoSuchMethodError : method not found: '[]'
Receiver: Instance of 'MyData'
Arguments: ["name"]

我使用的是Chromium版本33.0.1750.48(251129(和聚合物0.9.5

医生说我可以使用Object,但这似乎是错误的?有什么提示吗
PolymerElement#fire:http://goo.gl/DYXMiZ
thx

Günter把我的方向指向了正确的方向-这是polymer_signals.dart*中的一个错误

polymer_signals.dart(49号线(

@initMethod
void registerListener() {
  // signal listener at document
  document.addEventListener('polymer-signal', (e) {
    _notify(e.detail['name'], e.detail['data']);
  });
}

作为目前的解决方案:

// (sender.dart)
asyncFire('polymer-signal',detail: { 'name' : "alertevent", 'data' : new MyData("Mike",47) });

// (receiver.html)
<polymer-element name="mm-alert-list" on-add-alert-event="{{handleAddAlert}}">
    ...
    <polymer-signals on-polymer-signal-alertevent="{{fooSignal}}"></polymer-signals>       
</polymer-element>
// (receiver.dart)
...
@CustomTag('mm-alert-list')
class AlertListElement extends PolymerElement {
...
fooSignal(final CustomEvent event, detail, sender){
    print('<br>[my-app] got a [' + detail.name + '] signal<br>');
}
...
}

});

[更新]提交了一个错误:https://github.com/ErikGrimes/polymer_elements/issues/143

有一个限制,即事件详细信息只允许基元类型(String、int、double(、List、Map或其中的List或Map。我以为这个限制几个月前就消失了,但也许它又回来了。

编辑

我只是在没有聚合物的情况下尝试了一下,它起到了的作用

var b = dom.querySelector('#button');
b.onClick.listen((e) {
  b.dispatchEvent(new dom.CustomEvent('polymer-signal',detail: new MyData("Mike","99")));
});

如果使用this(聚合物元素(而不是b,这也应该有效。

相关内容

最新更新