MXMLを恐れないでください。ビューのレイアウトに最適です。独自の再利用可能なコンポーネントを作成する場合、ActionScriptで作成すると、もう少し制御できる場合がありますが、再利用できないビューの場合は、MXMLの方がはるかに優れています。より簡潔で、バインディングの設定は非常に簡単です。
ただし、純粋なActionScriptでのバインディングは、それほど面倒である必要はありません。多くのことが行われるMXMLのように単純になることは決してありませんが、それほど多くの労力をかけずに行うことができます。
あなたが持っているBindingUtilsのは、メソッドbindSetterとbindPropertyです。私はほとんどの場合前者を使用します。通常、何らかの作業をしたりinvalidateProperties、値が変更されたときに呼び出したりするため、プロパティを設定することはほとんどありません。
知っておく必要があるのは、これら2つがタイプのオブジェクトを返すChangeWatcherことです。何らかの理由でバインディングを削除する場合は、このオブジェクトを保持する必要があります。これが、ActionScriptの手動バインディングをMXMLの手動バインディングよりも少し不便にしている理由です。
簡単な例から始めましょう:
BindingUtils.bindSetter(nameChanged, selectedEmployee, "name");
これにより、変数内のオブジェクトnameChangedのプロパティが変更されたときにメソッドを呼び出すバインディングが設定されます。このメソッドは、プロパティの新しい値を引数として受け取るため、次のようになります。nameselectedEmployeenameChangedname
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バインド可能である必要があるため) 。