Happy Man

mash-uppy

19  08 2008

ExtGWTでMVC (その6)

このタイトルは、今回で終わりにしようと思います。
MVC以外にもチョロチョロと書きたいことがあるので。。。

というわけで
最後は、イベント駆動について補足です。

1.同じViewに配置されているコンポーネント間のデータの受け渡しは、
イベントよりはsetXXXXで十分事足りる。
スマン、省略。。。

2.複数のView間でのデータの受け渡しは、
イベント駆動を使うと楽。

例えば、Tableの1レコードがCar(extends BaseTreeModel)で、
選択状態が変わった場合のイベント発火の手順

TableBinder<Car> binder = new TableBinder<Car>(table, store);
binder.addSelectionChangedListener(new SelectionChangedListener<ModelData>() {
  public void selectionChanged(SelectionChangedEvent se) {
    Car c=(Car) se.getSelectedItem();
      if (c!=null) {
        //EVENT_FOOというイベントに選択されているCarオブジェクトを積んだイベントオブジェクトを生成
        AppEvent evt = new AppEvent(App.EVENT_FOO, c);

        //また、複数のオブジェクトをイベントに積んでみたいという場合、
        //AppEvent#setDataメソッドを使うと、キーに対してCarオブジェクトを設定することができます。
        evt.setData("abc", c);

        //そして、イベント発火
        fireEvent(evt);
     }
  }
});

受け取り側でのデータの取り出し方は、View#handleEventの中で

public class XXXXView extends View {
  protected void handleEvent(AppEvent event) {
  if (event.type == App.EVENT_FOO) {
      //こういう方法や
      Car dataCar = (Car) event.data;

      //こういう感じ
      Car abcCar = (Car) event.getData("abc");

      //とりだしたCarでViewに配置しているコンポーネントを更新する

その6まで引っ張ってしまいましたが、
ExtGWTを使うことで
(自分の中での)今、一番、柔軟なソフトウェア設計である
MVC+非同期イベント駆動モデル
が簡単に実装できることを感じてもらえればいいなかな。
と思っています。


Leave a Reply

« 今更ですが。。。 雨降り »