0

私はGoogleクロージャーのウェブアプリに取り組んでおり、構造は次のようになっています。

App
  + Control Pane
  |  + Search Box
  |  + Search Button
  + Result Pane
     + Results
     + Next Page Link

実際のコンポーネント構造はかなり複雑です。重要な点は、コンポーネントツリー全体に、特定のアクションを開始できるさまざまなコンポーネントが存在することです。この例では、Enterキーを押す、Search Boxを押すSearch Button、またはNext Pageすべてを押すには、クエリを実行する必要があります。

これは処理するのに十分簡単です。コンポーネントツリーのどこにいても、どの子でも実行できます

this.dispatchEvent(App.EventType.ACTION, ...)

Appイベントが上向きに伝播するときにそれを聞くことができます。問題は別の方向です。Appクエリからデータを受信すると、すべての子にデータをプッシュする必要があります。

コンポーネントツリー内の位置は変更される可能性があるため、およびにApp直接プッシュしようとするのは非常に脆弱なようです。私がやりたいのは、イベントを開催し、すべての子供たち(およびサブ子供たちなど)にそれを聞いてもらうことです。Search boxResultsApp.EventType.DATA_RECEIVED

私が見つけたグーグルクロージャーでこれを行う唯一の方法は、グローバルパブリックシングルトンインスタンスを作成し、すべてのイベントAppのソースとして使用するか、すべての子供とサブ子供に配管することです。App.EventType.DATA_RECEIVEDApp

これらは両方とも、独自の方法で乱雑で壊れやすいものです。

下向きに泡立つイベントをディスパッチするための閉鎖の簡単な方法はありますか?

4

1 に答える 1

0

それはあまり満足のいく答えではありませんが、それは私が決めたものです:

コンポーネントツリーのでそのようなことを伝える良い方法はありません。クロージャ自体でさえこの問題にぶつかりopt_domHelper、ツリーをすべてのサブコンポーネントに渡します。

goog.ui.Component私の提案は、アプリのサブクラスを作成し、アプリケーションのイベントチャネルとして指定された1つのイベントリスナーなど、他の環境変数と他の環境変数のmyapp.Environment両方を含むクラスを作成することです。opt_domHelper

それ自体は良い解決策ではありませんが、考えられるすべての悪の中で最も少ないものです。そして、あなたがすでにopt_domHelperどこでも忠実に通過しているなら、それはさらに悪い問題ではありません:配管がより拡張可能になり、それ自体が実装者(代わりにopt_domHelper通過する)から隠されます。environment

于 2013-01-31T18:46:04.470 に答える