は、MXMLを恐れてはいけません。ビューをレイアウトするのに最適です。 再利用可能なコンポーネントを記述してActionScriptで記述すると、制御が少ししかできない場合がありますが、再利用不可能なビューの場合は、MXMLがはるかに優れています。それは、より簡潔だ、バインディングは、セットアップが簡単ですextemelyなど
しかし、純粋なActionScriptでバインディングは、痛みのそれくらいである必要はありません。多くのことが行われているMXMLほどシンプルになることはありませんが、それほど多くの労力を費やす必要はありません。
BindingUtils
とその方法はbindSetter
とbindProperty
です。ほとんどの場合、前者を使用します。通常は仕事をしたいのですが、値が変わるときにはinvalidateProperties
に電話してください。ほとんどの場合、プロパティを設定する必要はありません。
あなたが知る必要があることは、これらの2つがタイプChangeWatcher
のオブジェクトを返すことです。何らかの理由でバインディングを削除する場合は、このオブジェクトを保持する必要があります。これは、ActionScriptでの手作業のバインディングをMXMLより手軽にするものです。
のは、簡単な例を見てみましょう:
BindingUtils.bindSetter(nameChanged, selectedEmployee, "name");
これは設定しているが、メソッドnameChanged
呼び出しますバインドするときに、変数selectedEmployee
変更内のオブジェクトのプロパティname
。 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
プロパティが設定されている場合、それがあったかどうかを確認するために見えることです新しい値がnull
の場合は、name
プロパティの新しいバインドを設定しない限り、プライベート変数を設定します(currentEmployeeNameCW.unwatch()
)。最も重要なことは、バインディングコールによって返されたChangeWatcher
が保存されることです。
これは基本的なバインディングパターンであり、正常に動作すると思います。しかし、少しシンプルにするためのトリックがあります。代わりにあなた自身にバインドすることができます。 currentEmployee
プロパティが変更されるたびにバインディングを設定したり削除したりする代わりに、バインディングシステムで行うことができます。あなたのcreationComplete
ハンドラ(またはコンストラクタまたは初期少なくともいくつかの時間)で、あなたがそうのようなバインディングを設定することができます。
BindingUtils.bindSetter(currentEmployeeNameChanged, this, ["currentEmployee", "name"]);
これはthis
上currentEmployee
プロパティに、だけでなく、name
プロパティにだけでなく、バインディング設定しますこのオブジェクトにだからいつでもどちらかのメソッドを変更するcurrentEmployeeNameChanged
が呼び出されます。バインディングを決して削除する必要がないため、ChangeWatcher
を保存する必要はありません。
第2の解決策は、多くのケースで動作しますが、私は最初のものは(非表示のクラスでバインディングを扱う場合は特に、時々必要であることを発見したthis
は、イベントディスパッチャなければならないとcurrentEmployee
がなければならないので、それが働くためにバインド可能)。
大書込み。これは非常に役に立ちました。ありがとう! – airportyh
本当に偉大な書き込み。 – Kevin
本当に素晴らしい書き込み!簡単な質問。最初のソリューションへのより簡単なアプローチは、単にcurrentEmployeeNameCWがnullであるかどうかを確認することではないでしょうか? nullでなければ、バインディングが存在するので、currentEmployeeNameCW.unwatch()を呼び出します。より一般化された、まだ非常に簡潔な解決策のようです。 – rinogo