Это один из способов сделать это, конечно. Но вы также можете создать другой класс, скажем, для хранения данных, записанных одним (или любым) из ваших компонентов, а затем дать каждому компоненту ссылку на этот объект; это может дать вам тот же эффект с немного меньшим количеством кода и ручной обработкой событий.
Например, объект класса, содержащий данные, может выглядеть примерно так (обратите внимание на атрибут Bindable
в открытом члене:
package
{
public class MyBindableObject
{
[Bindable]
public var myStringProperty:String = "";
public function MyBindableObject()
{
//
}
}
}
... и ваш основной контейнер приложения, который первоначально создал бы объект (и раздал ссылки на его подкомпоненты), например:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:local="*" initialize="this_initialize(event)">
<mx:Script>
<![CDATA[
[Bindable]
private var myObject:MyBindableObject;
private function this_initialize(event:Event):void
{
myObject = new MyBindableObject();
}
]]>
</mx:Script>
<mx:TextInput text="{myObject.myStringProperty}" />
<local:MyCustomComponent myObject="{myObject}" />
<local:MyOtherCustomComponent myObject="{myObject}" />
</mx:WindowedApplication>
... и MyCustomComponent (обратите внимание на атрибуты Bindable
& Inspectable
), которые в этом случае записываются непосредственно в myObject.myStringProperty
:
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
[Bindable]
[Inspectable]
public var myObject:MyBindableObject;
private function myEventHandler(event:Event):void
{
myObject.myStringProperty = txt.text;
}
]]>
</mx:Script>
<mx:TextInput id="txt" text="{myObject.myStringProperty}" keyUp="myEventHandler(event)" />
... и MyOtherCustomComponent, который получает изменения, сделанные в предыдущем компоненте (и которые также случайно распространяются на приложение контейнера):
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
[Bindable]
[Inspectable]
public var myObject:MyBindableObject;
]]>
</mx:Script>
<mx:TextInput text="{myObject.myStringProperty}" />
</mx:Canvas>
Итак, снова приложение-контейнер инициализирует экземпляр объекта, привязывает одно из свойств своих собственных подкомпонентов к значению свойства этого объекта (необязательно) и передает ссылки на этот объект любому из его подкомпонентов, который может захотеть его использовать. Второй компонент в этом случае записывает значение, а два других сразу же получают изменения, поскольку myStringProperty в классе MyBindableObject помечен как Bindable, и каждый компонент содержит прослушиватель для изменений этого свойства.
Пример несколько прост в том, что он на самом деле просто устанавливает строковое значение для некоторого объекта, тем самым перенося работу по диспетчеризации событий в инфраструктуру Flex, которая исключает только несколько строк кода - но это, вероятно, хорошая вещь здесь поскольку на самом деле нет необходимости разрабатывать пользовательское событие для простых событий изменения текста / изменения свойства, поскольку Flex выполняет большую часть или даже всю эту работу за вас.
Тем не менее, это все еще зависит от того, насколько вы хотите настроить свою TextPanel. Если вы хотите превратить его в более сложный компонент, то я бы, вероятно, предложил переместить начальную реализацию объекта в сам TextPanel, сделать то, что вы сделали, определив и отправив дополнительные пользовательские события, и имея основной компонент app и родственный компонент прослушивать уведомления о событиях в компоненте или в привязываемом объекте, либо с помощью textPanel.addEventListener (или аналогично встроенному в MXML), либо с помощью textPanel.myObject.addEventListener, в зависимости от того, какие из них являются подходящими.