通信中のオーバーレイ
ボタンを押すと受注を読み込む画面です。サーバは意図的に遅れて応答するようにしてあり、その間オーバーレイが表示されます。
オーバーレイを画面のアクタに持たせられない理由
Screen >> load = (
overlay tell show.
r := (Http get: 'orders.json?delay=1200') forced.
overlay tell hide.
self with: { answer: self countIn: r } ).
ハンドラは次の状態を返し、状態が変わったときに描き直されます。forced で待っている間は、ハンドラがまだ状態を返していないので描き直されません。画面に loading : Bool のようなフィールドを持たせても、それが真になった状態が描かれるのは返事が戻った後です。実測でも、描き直しは待つ前と返った後の二回だけでした。
そのため、オーバーレイは別のアクタにして、ページの別の場所に mount します。画面のアクタが待っている間も、オーバーレイのアクタはメッセージを処理できます。一つのアクタが待つことと、ページ全体が止まることは別です。
forced で書く場合
オーバーレイを出す、待つ、消す、の三行が順に一つのハンドラに収まります。返事を自分宛のメッセージとして受け取る書き方と比べて、処理の順序がコードの順序と一致します。ボタン一回に通信一回の画面に向いています。
アクタである共通部品
日付を選ぶの部品はアクタではなく、状態を持ちません。オーバーレイは画面が待っている間に表示を変える必要があるので、表示中かどうかを状態として持つアクタです。
オーバーレイは呼び出し元にメッセージを返さないので、呼び出し元の画面の型に依存しません。どの画面からでも使えます。
ページに用意するのは、class 名二つ分の CSS と、画面のアクタの領域の外に置く要素です。