Почему изменение длины 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 изменяется в другом месте приложения, он не вызывает метод установки в компоненте, который является местом назначения для привязки данных.

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


person Dilip Shah    schedule 15.12.2010    source источник
comment
Поправьте меня, если я ошибаюсь, но разве синтаксис тега метаданных Bindable не должен быть [Bindable(event="questionsChanged")]?   -  person bedwyr    schedule 15.12.2010
comment
И Bindable не должен располагаться перед установщиком вместо геттера.   -  person 2DH    schedule 15.12.2010
comment
@ 2DH, при привязке к установщику/получателю установщик должен отправить событие. Получатель использует тег метаданных Bindable, чтобы указать, какое событие он будет ожидать, чтобы указать ему уведомить все, что связано с ним об обновлении.   -  person bedwyr    schedule 15.12.2010
comment
Да, ты прав. В примерах Adobe он был поставлен перед сеттером в одном из примеров и перед геттером в другом. Это меня смутило. Мне стыдно.   -  person 2DH    schedule 15.12.2010
comment
@2DH Получатель и установщик рассматриваются компилятором Flex как единое целое, и не имеет значения, какой тег метаданных Bindable находится перед ним. Например, у вас могут быть свойства Bindable только для чтения, и в этом случае у вас есть только геттер для размещения Bindable раньше. @bedwyr Я почти уверен, что если значение не назначено (также известное как событие =), то указанное значение переходит к свойству события по умолчанию, которое для Bindable является «событием», поэтому исходный код не является неверным. Я считаю более явным использование полного синтаксиса.   -  person JeffryHouser    schedule 16.12.2010
comment
@bedwyr Еще одна вещь. Сеттеру не нужно отправлять событие bindable/change, хотя это наиболее распространенная практика. Что угодно может отправить это событие и вызвать привязку. Используя этот подход, вы можете иметь привязываемые свойства только для чтения.   -  person JeffryHouser    schedule 16.12.2010


Ответы (1)


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

questions = somethingArrayCollection();

Это не будет:

questions.addItem(newQestion)

Переменная вопросов — это, по сути, указатель. Для изменения того, на что указывает переменная, событие set не требуется.

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

person JeffryHouser    schedule 15.12.2010