Вы можете создать некоторый класс, который содержит данные и отслеживает изменения.И связывайте элементы управления с полями этого объекта данных, используя двухстороннее связывание.
Базовый класс для вашего объекта данных может выглядеть следующим образом:
public class DataObjectsBase extends EventDispatcher
{
protected function setNewSetterValue(propertyName:String, value:Object):void
{
var internalPropertyName:String = "_" + propertyName;
var oldValue:Object = this[internalPropertyName];
if (oldValue == value)
return;
this[internalPropertyName] = value;
dispatchUpdateEvent(propertyName, oldValue, value);
}
protected function dispatchUpdateEvent(propertyName:String, oldValue:Object, value:Object):void
{
makeChanges();
dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, propertyName, oldValue, value));
}
protected function makeChanges():void
{
if (!_changed)
{
_changed = true;
dispatchEvent(new Event("changedChanged"));
}
}
public function resetChanges():void
{
_changed = false;
dispatchEvent(new Event("changedChanged"));
}
private var _changed:Boolean = false;
[Bindable("changedChanged")]
public function get changed():Boolean
{
return _changed;
}
}
Эта реализация опирается на соглашение об именовании следующегоkind:
public class MyDataImplementation extends DataObjectsBase
{
private var _comment:String = "";
[Bindable(event = "propertyChange")]
public function get comment():String
{
return _comment;
}
public function set comment(value:String):void
{
setNewSetterValue("comment", value);
}
}
Таким образом, закрытое поле должно называться так же, как аксессор, но начинается с подчеркивания.
Если вы заполните свой класс данных несколькими полями (строки, логические значения и т. д.), вы можете использоватьэто следующим образом:
<fx:Script>
<![CDATA[
[Bindable]
private var personalInfo:PersonalInfo /* extends our DataObjectsBase */;
]]>
</fx:Script>
<s:TextInput text="@{personalInfo.firstName}" />
<s:CheckBox selected="@{personalInfo.receivePromotions}" />
<s:Button label="Apply" enabled="{personalInfo.changed}" />
Этот код является всего лишь черновиком, но я надеюсь, что вы поняли:)