getter を介して公開された EventStreamProvider を持つ WebComponent にカスタム イベント ハンドラーをバインドしようとしましたが、「Class 'DivElement' has no instance getter 'onMainAction'.」というメッセージが表示されます。
コンポーネントの .dart コードを削除しました...
import 'dart:html';
import 'dart:async';
import 'package:web_ui/web_ui.dart';
class SegmentedButtonsListComponent extends WebComponent {
static const EventStreamProvider<CustomEvent> mainActionEvent = const EventStreamProvider<CustomEvent>("MainActionEvent");
Stream<CustomEvent> get onMainAction => mainActionEvent.forTarget(this);
}
コンポーネントの使用量の削減…</p>
<x-segmented-buttons-list id="segmented-buttons-list" on-main-action="eventHandler($event)"></x-segmented-buttons-list>
main.dart からトリミングされたコード…</p>
import 'dart:html';
import 'dart:async';
import 'package:web_ui/web_ui.dart';
const EventStreamProvider<CustomEvent> mainActionEvent = const EventStreamProvider<CustomEvent>("MainActionEvent");
void eventHandler(CustomEvent event) {
print("""
Yabba Dabba Doo!
Type: ${event.type}
Detail: ${event.detail}
""");
}
void main() {
mainActionEvent.forTarget(query('#segmented-buttons-list')).listen(eventHandler);
}
「MainActionEvent」カスタム イベントは、この「リスト」コンポーネント内でインスタンス化されたコンポーネントによってディスパッチされています。
上記の例からわかるように、main.dart で EventStreamProvider を作成し、コンポーネントをターゲットにすると、イベントをキャッチできます。これは正常に動作します (ただし、コンポーネントの Stream ゲッターはバイパスされます)。
しかし、main.dart の EventStreamProvider を省略して、コンポーネントの onMainEvent ゲッターに単純にバインドできれば素晴らしいことです。
それは可能ですか?
更新 2013-05-05: Siggi は、現時点ではこれを行うことはできませんが、要素の xtag を介してコンポーネントの CustomEventProvider の getter を参照する方法があることを以下で説明しています。main() イベント ループが終了するまで xtag が入力されないため、main() が完了した後にタイマーを使用して DOM をクエリする必要があることがわかりました。
void postMainSetup() {
query('#segmented-buttons-list').xtag.onMainAction.listen(eventHandler);
}
void main() {
Timer.run(postMainSetup);
}
上記のセットアップでは、コンポーネントを監視するために新しい CustomEventProvider は必要ありません。