MXMLを恐れないでください。ビューのレイアウトに最適です。独自の再利用可能なコンポーネントを作成する場合、ActionScriptで作成すると、もう少し制御できる場合がありますが、再利用できないビューの場合は、MXMLの方がはるかに優れています。より簡潔で、バインディングの設定は非常に簡単です。
ただし、純粋なActionScriptでのバインディングは、それほど面倒である必要はありません。多くのことが行われるMXMLのように単純になることは決してありませんが、それほど多くの労力をかけずに行うことができます。
あなたが持っているBindingUtils
のは、メソッドbindSetter
とbindProperty
です。私はほとんどの場合前者を使用します。通常、何らかの作業をしたりinvalidateProperties
、値が変更されたときに呼び出したりするため、プロパティを設定することはほとんどありません。
知っておく必要があるのは、これら2つがタイプのオブジェクトを返すChangeWatcher
ことです。何らかの理由でバインディングを削除する場合は、このオブジェクトを保持する必要があります。これが、ActionScriptの手動バインディングをMXMLの手動バインディングよりも少し不便にしている理由です。
簡単な例から始めましょう:
BindingUtils.bindSetter(nameChanged, selectedEmployee, "name");
これにより、変数内のオブジェクトnameChanged
のプロパティが変更されたときにメソッドを呼び出すバインディングが設定されます。このメソッドは、プロパティの新しい値を引数として受け取るため、次のようになります。name
selectedEmployee
nameChanged
name
private function nameChanged( newName : String ) : void
この単純な例の問題は、このバインディングを設定すると、指定したオブジェクトのプロパティが変更されるたびに起動することです。変数の値selectedEmployee
は変更される可能性がありますが、変数が以前に指していたオブジェクトに対してバインディングが設定されたままです。
これを解決するには、2つの方法があります。バインドを削除する(そして代わりに新しいバインディングを設定する)ときに、ChangeWatcher
返されたものを保持しBindingUtils.bindSetter
て呼び出すか、自分自身にバインドします。unwatch
最初に最初のオプションを示し、次に自分自身にバインドすることの意味を説明します。
currentEmployee
をゲッター/セッターのペアにして、次のように実装できます(セッターのみを表示)。
public function set currentEmployee( employee : Employee ) : void {
if ( _currentEmployee != employee ) {
if ( _currentEmployee != null ) {
currentEmployeeNameCW.unwatch();
}
_currentEmployee = employee;
if ( _currentEmployee != null ) {
currentEmployeeNameCW = BindingUtils.bindSetter(currentEmployeeNameChanged, _currentEmployee, "name");
}
}
}
currentEmployee
プロパティが設定されると、前の値があったかどうかを確認し、その場合はそのオブジェクト()のバインディングを削除し、currentEmployeeNameCW.unwatch()
プライベート変数を設定します。新しい値がnull
設定されていない限り、新しいバインディングが設定されます。name
プロパティのために。最も重要なのChangeWatcher
は、バインディング呼び出しによって返されたものを保存することです。
これは基本的なバインディングパターンであり、正常に機能すると思います。ただし、少し簡単にするために使用できるトリックがあります。代わりに自分自身にバインドすることができます。currentEmployee
プロパティが変更されるたびにバインディングを設定および削除する代わりに、バインディングシステムにそれを実行させることができます。ハンドラー(またはコンストラクター、creationComplete
または少なくとも少し早い段階)で、次のようにバインディングを設定できます。
BindingUtils.bindSetter(currentEmployeeNameChanged, this, ["currentEmployee", "name"]);
currentEmployee
これにより、のプロパティだけでなく、このオブジェクトthis
のプロパティへのバインディングも設定されます。name
したがって、どちらかを変更すると、メソッドcurrentEmployeeNameChanged
が呼び出されます。ChangeWatcher
バインディングを削除する必要がないため、を保存する必要はありません。
2番目のソリューションは多くの場合機能しますが、特に非ビュークラスのバインディングを操作する場合は、最初のソリューションが必要にthis
なることがあります(イベントディスパッチャーである必要があり、currentEmployee
バインド可能である必要があるため) 。