reactive-web: Lift をシンプルに

プロパティ/属性

イベントは、ブラウザからサーバー上で実行されているコードへとイベントを伝えるメカニズムです。イベントを土台に構築されたメカニズムにはもう 1 つあり、それがプロパティまたは属性です。このメカニズムを使うと、ブラウザの状態を変更することができます。プロパティの状態は、イベントによってサーバー上のコードに送られます。プロパティに対する変更は、JavaScript のキューイングメカニズムによってブラウザに送信されます。

DomProperty

DomProperty は、DOM 要素のプロパティまたは属性に対するプロキシとしてふるまいます。DomProperty には、プロパティの値の更新を発火する EventStream[String] があります。また、JsExp によってプロパティの値を設定する update メソッドがあります。

DomEventSource 同様、これを Elem に適用して新しい Elem を取得したり、CSS セレクタおよびレガシーバインディング用の NodeSeq=>NodeSeq 関数として使用したりできます。ただし DomEventSource の場合とは異なり、そうするためには render を呼び出すか、または暗黙の変換を利用する必要があります。DomProperty の場合、プロパティとその値に対応する追加の属性を持つ要素が返されます。さらに、withEvents を呼び出すことでリンクされたイベントも、その要素に適用されます。また、その要素に id 属性がない場合は追加されます。render (および暗黙の変換) は、暗黙の Page を取ります (デフォルトは現在の Lift リクエストです)。要素の id はそのページの DomProperty に保存され、更新コマンドをブラウザに送信できるようになっています。

PropertyVar

通常、プログラマが DomProperty を直接使用することはありません。DomProperty は生の (raw) 値を String として発火し、新しい値は JsExp として受け付け、現在の値を保持しません。代わりに、プログラマはほとんどの場合、タイプセーフな PropertyVar を使用することになるでしょう。PropertyVarVar を継承し、DomProperty をラップします。値を設定すると、その DomProperty (Ajax 経由か Comet 経由かを問わず) に対して登録されている任意の Page 上で、対応するプロパティがブラウザ内で変更されます。 ただし、値を設定する Ajax イベントを現在発火している Page があれば、それは対象外です。

PropertyVar をインスタンス化する最も簡単な方法は、PropertyVar("name")(initialValue) と記述することです。属性の名前が javascript のプロパティと異なる場合には、名前に続けて 2 番目のパラメータとして属性の名前を指定できます。

  class Snippet {
    val value = PropertyVar("value")("")
    def render =
      "input" #> value
  }

このファクトリは、該当する型のブラウザでの表現方法を指定する暗黙の PropertyCodec パラメータを取ります。デフォルトの暗黙のインスタンスとして、StringIntOption[Int] (None-1 として表現されます)、および Boolean (false は属性を生成せず、true は、checked="checked" のように、その値に名前が設定された属性を生成します) があります。

以下に DomPropertyPropertyVar のメンバの一部を示します。

updateOn
1 つ以上の DomEventSource を対象にこのメソッドを呼び出すと、ブラウザで該当イベントが発生するたびにプロパティの値を発火させる JsEventStream が登録されます。Page がその後に DomProperty に追加されると (たとえばページがレンダリングされたときなど)、プロパティに対する更新はサーバーに届きます。DomProperty の場合、プロパティに対する更新は values イベントストリームから発火され、PropertyVar の場合は、PropertyVar に新しい値が含まれます。DomProperty または PropertyVar を返します。
withEvents
updateOn の場合と同様ですが、DomProperty は、レンダリング先のすべての要素にイベントを自動的に追加します。DomProperty または PropertyVar を返します。
render
NodeSeq=>NodeSeq バインディング関数を返します。暗黙の Page が必要です。
render(Elem)
プロパティを Elem に適用し、新しい Elem を返します。暗黙の Page が必要です。