Это один из способов сделать это, конечно. Но вы также можете создать другой класс, например, для хранения данных, написанных одним (или любым) из ваших компонентов, а затем дать каждому компоненту ссылку на этот объект; что может привести к такому же эффекту с меньшим количеством обработки кода и ручного управления событиями.
Например, класс объект, содержащий данные может выглядеть следующим образом (обратите внимание на атрибут 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, сделайте так, как вы это делали, определяя и отправляя дополнительные пользовательские события и имея основное приложение и компонент для родного брата прослушивать уведомления о событиях для компонента или связанного объекта, либо с помощью textPanel.addEventListener (или аналогично встроенного в MXML), либо textPanel.myObject.addEventListener, в зависимости от того, какие из них были подходящими.
Я не понимаю, почему вы сделали собственность. В этом нет необходимости. – sharvey