2010-12-15 1 views
0

У меня есть компонент, где я разоблачить собственности «вопросы» со следующим кодом:Почему изменение длины ArrayCollection не вызывает Setter на компоненте, используя его в качестве источника данных?

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, а «вопросы» находятся в модели и, следовательно, он определен как источник привязки данных.

Когда размер ArrayCollection 'questions' изменяется в другом месте приложения, он не вызывает метод setter в компоненте, который является местом назначения привязки данных.

Может ли кто-нибудь помочь мне понять, почему это так?

+1

Исправьте меня, если я ошибаюсь, но не должен синтаксис тегов Bindable метаданных быть `[Bindable (event =" questionsChanged ") ] `? – bedwyr 2010-12-15 18:45:33

ответ

3

Вам нужно будет показать код, в котором вы меняете коллекцию массивов. Но это будет срабатывать сеттер:

questions = somethingArrayCollection(); 

Это не будет:

questions.addItem(newQestion) 

Переменная вопросы, в основном, указатель. Изменение вещи, на которую указывает переменная, не нуждается в установленном событии.

Я предлагаю вам взглянуть на CollectionChangeEvent, который создает ArrayCollection, когда элементы добавляются к этому и из него. Прослушайте событие и выполните действия «change» в обработчике событий. (или привязать к жизненному циклу и аннулировать некоторый флаг и выполнить изменения в commitProperties())