0

次のコードでプロパティ「questions」を公開するコンポーネントがあります。

private var _questions:ArrayCollection;
private var questionsChanged:Boolean;

[Bindable("questionsChanged")]
public function get questions():ArrayCollection {
    return _questions;
}

public function set questions(value:ArrayCollection):void {
    if (_questions != value) {
        _questions = value;
        questionsChanged = true;
        invalidateProperties();
        dispatchEvent(new Event("questionsChanged"));
    }
}

このコンポーネントでは、commitProperties()を使用してロジックを実装します。

私はCairngormを使用していますが、「質問」はモデルに含まれているため、データバインディングのソースとして定義されています。

'questions' ArrayCollectionのサイズがアプリケーションの他の場所で変更された場合、データバインディングの宛先であるコンポーネントのsetterメソッドを呼び出していません。

誰かが私にこれが事実である理由を理解するのを手伝ってもらえますか?

4

1 に答える 1

3

配列コレクションを変更する場所のコードを表示する必要があります。しかし、これはセッターを起動します:

questions = somethingArrayCollection();

これはしません:

questions.addItem(newQestion)

質問変数は、基本的にはポインターです。変数が指すものを変更する場合、setイベントは必要ありません。

CollectionChangeEventを確認することをお勧めします。これは、アイテムがそこに追加されたり、そこからアイテムが追加されたりしたときにArrayCollectionが起動します。イベントをリッスンし、イベントハンドラーで「変更」アクションを実行します。(またはライフサイクルに結び付けていくつかのフラグを無効にし、commitProperties()で変更を実行します)

于 2010-12-15T20:15:16.643 に答える