Передача данных между гибкими компонентами - PullRequest
3 голосов
/ 08 мая 2009

Я новичок в сгибании, так что прости меня, если это глупый вопрос.

Сейчас я использую пользовательские события для передачи данных из одного компонента в другой. Моя проблема в том, что события только всплывают. Как передать данные компоненту, который не является родителем компонента, отправляющего событие?

Вот базовый макет. Я пытаюсь передать данные из компонента 1 в компонент 3.

Application MXML
     Component 1
     Component 2
          Component 3

Ответы [ 3 ]

10 голосов
/ 08 мая 2009

Если часть данных требуется для всех компонентов в графике / дереве, лучше всего выставить для каждого из них общедоступное свойство. Пусть дочерние компоненты отправляют всплывающее событие, которое обрабатывается родителем, который может установить новое значение привязываемого свойства. Если вы связываете свойство от родительского элемента до дочернего, это будет «каскадно» распространяться на другие компоненты.

<!-- in root application -->
<Component1 myData="{myData}"/>

Если вам нужно вызвать дополнительную логику, вы можете определить пару get / set вместо public var и добавить логику в сеттер:

[Bindable] private var _myData;
public function set myData(value:Object):void
{
    _myData = value;
    doSomeLogic();
}

Еще лучше было бы использовать среду аннулирования Flex для оптимизации производительности:

_myDataChanged : Boolean = false;
[Bindable] private var _myData;
public function set myData(value:Object):void
{
    if (_myData != value) {
        _myData = value;
        _myDataChanged = true;
    }
    invalidateProperties();
}

override protected function commitProperties() : void {
    super.commitProperties();
    if (_myDataChanged) {
        _myDataChanged = false;
        doSomeLogic()
    }
}

Этот шаблон используется повсеместно во всех компонентах UIC, составляющих инфраструктуру Flex. Вам также может понадобиться переопределить updateDisplayList (...) для позиционирования элементов.

2 голосов
/ 08 мая 2009

Самый простой способ - просто получить доступ к другому компоненту.

<Component1 name="component1/>

<Component2 name="component2" onClick="onClickHandler()"/>

private function onClickHandler(event:MouseEvent):void
{
    component1.property1 = "Random data";
    component1.sendData("Random Data");
}

Когда вы устанавливаете связываемое открытое свойство в component1, оно вызывает PropertyChangedEvent, который вы также можете обрабатывать.

У вас есть много вариантов здесь, посмотрите, какой из них лучше всего в контексте того, что вы пытаетесь сделать.

РЕДАКТИРОВАТЬ: Читая дальше о том, что, я думаю, вы пытаетесь сделать, вы пытаетесь получить доступ к component3 из component2, но component3 не легко виден для component1? Тем не менее, он должен быть доступен через component2 (компоненты, как правило, являются открытыми членами).

private function component1OnClickHandler(event:MouseEvent):void
{
     component2.component3.property1 = "Random data";
}

Надеюсь, это поможет!

0 голосов
/ 25 февраля 2014

Я недавно столкнулся с этой проблемой !! Так вот, как я преодолел это в случае, если кому-то это понадобится через 5 лет; -)

Эта ссылка решает проблему очень сильно.


  • Создайте пользовательский класс Event с необходимыми данными для передачи в качестве членов этого класса (как показано здесь ).
  • Отправка пользовательского события из Component1

    dispatchEvent(new CustomEvent("customEvent",myData));
    
  • Создайте метод в Component2, который принимает myData в качестве аргумента
  • Добавьте EventListener в родительский компонент и вызовите метод в Component2, передав event.myData
...