Как элемент должен получать ссылки на элементы дальше по дереву без жесткого кодирования во Flex? - PullRequest
0 голосов
/ 09 июля 2010

У меня есть собственный компонент Flex Container, написанный на AS3, который называется StatisticsContainer. При использовании в приложении оно содержит различные пользовательские компоненты Label, называемые StatisticsBoxes. Таким образом, возможно, существует объект StatisticsContainer, содержащий 3 блока статистики: «AverageAge», «divorceRate» и «infantMortalityRate».

StatisticsContainer должен иметь возможность ссылаться и работать со всеми объектами статистики. Однако я не хочу жестко кодировать ссылки в StatisticsContainer, так как будут разные экземпляры StatisticsContainer с разными блоками StatisticsBox в них.

Так как же мне динамически предоставить StatisticsContainer ArrayCollection всех содержащихся в нем статистических ящиков?

Пока что я начал с такой функции в creationComplete StatisticsContainer:

for (var i:int = 0; i < numElements; i++) {
  if (getElementAt(i) is StatisticsBox) {
    statisticsBoxes.addItem(getElementAt(i));
  }
}

Это работает только в том случае, если ящики статистики являются прямыми подчиненными. Во всяком случае, это звучит немного странно.

Затем я попытался прослушать событие CreationComplete в StatisticsContainer. Однако они не поступают из StatisticsBox, потому что они не всплывают.

В конце я создал свое собственное событие, которое всплывает, и я запускаю его на creationComplete в StatisticsBox и слушаю его в StatisticsContainer. Это работает, но действительно ли это лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 10 июля 2010

Вы можете сделать так, чтобы каждый StatisticsBox регистрировался под своим StatisticsBoxContainer при создании.

StatisticsBoxContainer.mxml

<?xml version="1.0"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*">
    <mx:Script><![CDATA[
        import mx.collections.ArrayCollection;

        public var statisticsBoxes:ArrayCollection = new ArrayCollection();

]]></mx:Script>

    <local:StatisticsBox id="stats1" />
    <local:StatisticsBox id="stats2" />
    <local:StatisticsBox id="stats3" />

</mx:Canvas>

StatisticsBox.mxml

<?xml version="1.0"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="onCreationComplete()">
    <mx:Script><![CDATA[

        private function onCreationComplete():void {
            StatisticsBoxContainer(parentDocument).statisticsBoxes.addItem(this);
        }

]]></mx:Script>       
</mx:Canvas>

Я не уверен, если этоболее или менее хакерский, чем перебирать детей.Проблема с тем, как вы выполняете цикл сейчас, заключается в том, что вам нужно рекурсивно выполнять цикл с детьми, внуками и т. Д.

0 голосов
/ 10 июля 2010

У меня была точная проблема в паре разных проектов.Ради скорости я решил эту проблему, быстро пройдя по всем дочерним элементам, точно так же, как и вы, после завершения создания, и это выглядело так же «грязно» и «хакерски», но оно выполнило свою работу.

ActionScript isnОн не настолько зрелый, как другие языки, поэтому многие решения требуют быстрого взлома, потому что для его правильной работы потребуется написание целого фреймворка, что непрактично.

Я также решил проблему с помощью объекта Application.application.Это крутой маленький трюк, чтобы получить глобальную ссылку на вещи.Я использую это, когда мне нужны единичные экземпляры в моем приложении.Опять же, хакерский, но элегантно простой.

Применяя это к вашей ситуации, вместо того, чтобы запускать событие, которое должно всплыть во всем вашем коде, вы можете делать что-то вроде следующего:создан (и ваше пользовательское событие раньше было запущено):

Application.application.StatisticList.addItem(this);

Еще один крутой трюк, который я использую в подобных ситуациях, это словари вместо ArrayCollections.Они дают мне возможность выполнять «мгновенный поиск», когда мне это нужно, и в то же время разрешать итерации, когда это необходимо.Вы можете перебирать как ключи, так и значения словаря.Код становится примерно таким:

Application.application.StatisticList[this.id] = this;

Теперь вы можете получить доступ к своей статистике тремя способами:

  1. Мгновенно по прямому идентификатору
  2. В «порядке», итерациипо всем идентификаторам
  3. В «порядке», итерируясь по всем объектам StatisticBox (та же функциональность ArrayCollection)

Надеюсь, кое-что из этого поможет каким-то образом,

- gMale

...