はじめに
バインディングは implementation
タグを使ってバウンド要素上にメソッドとプロパティを定義することができます。バインディングによる実装はバウンド要素から直接呼び出すことができるメソッドとプロパティの新しいセットを提供します。
バインディング実装のメソッドとプロパティは XML の method
タグや property
タグを使って宣言形式で定義できます。外部実装 (例:バイナリの実装) が src
属性を使って定義することもできます。 src 属性が定義されると、implementation
要素のどの子供も無視されます。
メソッド
メソッドは method
要素を使って定義されます。 name
属性を使って与えられるその名前は要素上のメソッドを呼び出すのに使われる名前です。引数をともなう method
は、その引数と名前を method
要素配下で宣言される parameter
要素で定義します。
メソッドの実装は、body
要素の内部に含まれます。定義された引数はメソッド本体の中の名前に結び付けられます。
<method name="scrollToIndex"> <parameter name="index"/> <body> <![CDATA[ if (index < 0) return; ... ]]> </body> </method>
プロパティ
プロパティもまた、property
タグを使ってバウンド要素上に定義できます。プロパティの基本的なタイプが二種類あります。プロパティの最初のタイプは要素自信の上で直接セットされる生の値です。プロパティの次のタイプはプロパティが取り出されるかセットされるときに呼び出される関数を定義するものです。これらの関数は XBL 上で「getter」と「setter」と呼ばれます。
生の値のプロパティのために、property
タグの子供として初期値を定義できます。スクリプトはバインディングが結びつけられたときに評価され、結果の値が要素上に蓄えられます。bindingattached
イベントがまだ発生していないけれども、バインディングの無名コンテントは全面的に構築されたと仮定することができます。bindingattached
ハンドラがすべてのプロパティはバインディング上でアクセス可能であると仮定できる必要があるため、プロパティの初期化はいつもコンテント生成の後だけれどもバインディング結びつきのイベントの発生の前に生じます。
getter や setter をもつプロパティは onget
属性と onset
属性を使うか、より多弁な getter
要素と setter
要素を使って定義できます。もし、属性という手段と要素という手段の両方が getter や setter の定義に使われた場合、要素の手段のものは無視されます。
getter は、プロパティが呼び出されたときにその戻り値が返されるスクリプトを含みます。setter は、プロパティに新しい値がセットされたとき呼び出されるスクリプトを含みます。スクリプトの中では、val
という単語は新しい値を表すために使われます。
プロパティは readonly
属性を使って定数として指定することもできます。この属性を true
にセットすると、プロパティの値は変更不能となります。プロパティが readonly (読み取り専用) であってsetter が定義されていたら、setter は無視されます。
プロパティは無名コンテント要素へ呼び出しや代入を転送する getter や setter を定義するための短縮文法もサポートしています。element
属性は、プロパティを得るかプロパティをセットするときに使われるべきバウンド要素の下の無名コンテントのIDを定義します。
無名コンテント要素上で、プロパティは要素上の属性か要素上のプロパティのどちらかから呼び出すことができます。property
属性の値は無名コンテント要素上で使うプロパティの名前を定義します。attribute
属性は無名コンテント要素上で使う属性の名前を定義します。もしこれらの属性のいずれかが property
要素上で定義されていたら、定義されたどの getter も setter も無視されます。生の初期値もまた無視されます。property と attribute の両方が定義されると、プロパティは優先され、属性は無視されます。
実装の継承
継承のつながりの二つのバインディング両方に実装があるとき、派生したバインディングの実装は基底となるバインディングの実装から継承されます。メソッドとプロパティの照合は動的です。曖昧さをなくすことなしに、二つのバインディングが同じメソッドかプロパティを定義するなら、もっとも派生したバインディングのメソッドかプロパティが使われます。
バインディングが DOM 要素を拡張するため、バインディングは DOM 要素上に本来備えているどのメソッドとプロパティをもオーバーライド (上書き) することができます。たとえば、バインディングは Element
上の setAttribute
メソッドや、HTMLInputElement
のための value
プロパティの回収のオーバーライド (上書き) をすることもできるでしょう。
以下は現在のところ Mozilla には実装されていないようです。
実装は、implementation
要素上で定義された name
属性を使って名付けることもできます。実装が名前 (name) を持つとき、その名前は望みのメソッドやプロパティの曖昧さをなくすのに使うこともできます。
[編集者メモ: 以下の段落で、基底クラスのメソッドやプロパティへのアクセスを JavaScriptでどうアクセス可能にするかについての文法を提案しています。これは開かれた課題です。私たちは言語に独立した概念の定義や、基底バインディングのメソッドとプロパティへアクセスを可能とするものの定義を試みる必要があるでしょうか?]
たとえば、ColorPicker
実装から派生した ColorPickerGrid
があり、その両方で setColor
メソッドが定義されているバインディングがあると、以下のような文法で ColorPicker
のメソッドを呼び出すことができます。
... // myElement は ColorPickerGrid です myElement.ColorPicker.setColor(); // ColorPicker メソッドを呼び出します myElement.setColor(); // ColorPickerGrid メソッドを呼び出します ...
明確に基底クラスの名称を記述する方法が可能なのに加えて、baseBinding
という名前を基底クラスが何かを知る必要がなく基底バインディング上のメソッドやプロパティを特定するために使うことができます。これは、例えば addBinding
を使ったときなど、バインディングが暗黙に継承されたときに必要が生じます。
myElement.baseBinding.setColor(); // ColorPicker メソッドを呼び出します