AS3: Как узнать, изменился ли поставщик данных или его содержимое - PullRequest
3 голосов
/ 11 января 2011

Я реализую какой-то комбинированный элемент управления (путем расширения spark.components.supportClasses.DropDownListBase)

Теперь внутри этого элемента управления;Мне нужно знать:

  1. , если поставщик данных изменен / назначен.(что я могу сделать ... работает первый подход, приведенный ниже);
  2. , если какой-либо элемент в коллекции поставщика данных изменился.

Я пробовал 2 методаэто не помогло ...

1-й ПОДХОД:

        [Bindable("collectionChange")]
        override public function set dataProvider(value:IList):void
        {
            if (value) value.addEventListener(CollectionEvent.COLLECTION_CHANGE, onDataChange);

            super.dataProvider = value;
            trace("DATA CHANGED"); //fires
        }

        protected function onDataChange(event:CollectionEvent):void
        {
            trace("COLLECTION ITEM(S) CHANGED"); //does not fire
        }

2-й ПОДХОД:

С тех пороснован на DropDownListBase;он должен отправлять событие CollectionEvent.COLLECTION_CHANGE уже ..?

        public function myClass() //constructor
        {
            addEventListener(CollectionEvent.COLLECTION_CHANGE, onDataChange);
        }

        protected function onDataChange(event:CollectionEvent):void
        {
            trace("DATA CHANGED"); //does not fire
        }

Любые идеи?

ОБНОВЛЕНИЕ: отредактировано выше .. Первый подход позволяет мне узнать, если поставщик данных изменен, но нелюбой элемент обновляется в коллекции поставщика данных.Второй подход вообще не работает ..

1 Ответ

1 голос
/ 11 января 2011

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

  1. , если поставщик данных будет изменен / назначен.

Ваш первый подход должен работать.Можете ли вы сказать нам, что заставляет вас думать, что это не так?(Никаких следов я предполагаю?).И расскажите нам, что вы сделали, чтобы изменить dataProvider.

Второй подход не сработает, поскольку myClass не запускает событие collectionChange.

2, если какой-либо элемент в коллекции поставщика данных изменился.

На самом деле нет способа сказать это.В большинстве случаев коллекция - это просто список указателей на другие объекты.Если вы измените эти указатели, то событие collectionChange будет запущено.Если вы измените элемент, на который указывает указатель, коллекция не сможет узнать, что что-то изменилось.Привязка работает очень похоже, если вы поклонник MXML.

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

(collection.getITemAt(x) as myObject).property = newValue;

Сделайте что-то вроде этого:

  var myObject : MyObject = collection.getITemAt(x) as myObject
  myObject.property = newValue;
  collection.setItemAt(x, myObject);

Я ожидаю, что это вызовет событие collectionChange, но не первое.

Тем не менее,в контексте dropDownListBase: когда вы прокручиваете или открываете и закрываете раскрывающийся список, itemRenderers должен обновляться, чтобы отражать самые последние данные dataProvider.Но если вы что-то измените на лету, когда раскрывающийся список открыт, я не ожидаю, что оно будет обновляться автоматически [если вы не меняете dataProvider.

...