Получить изменения в любом элементе - PullRequest
1 голос
/ 18 мая 2011

У меня есть экран с несколькими компонентами (textInput, textArea, checkBox). Я хочу проверить, были ли какие-либо изменения в компонентах. Например, если введен текст или установлен флажок.

Есть ли прямой способ сделать это вместо проверки значения каждого компонента и установки логического значения для этого?

Спасибо

Ответы [ 3 ]

1 голос
/ 18 мая 2011

Три перечисленных вами компонента Spark (TextInput, TextArea, CheckBox) прослушивают событие изменения. Просто вызовите функцию, чтобы получать уведомления о событиях изменения в каждом компоненте, например:

<s/TextInput change="myTextInputChangeHandler(event)"/>
<s/TextArea change="myTextAreaChangeHandler(event)"/>
<s/CheckBox change="myCheckBoxChangeHandler(event)"/>
0 голосов
/ 18 мая 2011

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

Если вы пытаетесь выяснить, произошло ли изменение за определенное время (или последний проверенный экземпляр), единственным способом (я знаю) было бы сохранить предыдущий ввод (хэш ввода) и сравнить его с текущим вводом (хэш текущего ввода).

0 голосов
/ 18 мая 2011

Вы можете создать некоторый класс, который содержит данные и отслеживает изменения.И связывайте элементы управления с полями этого объекта данных, используя двухстороннее связывание.

Базовый класс для вашего объекта данных может выглядеть следующим образом:

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}" />

Этот код является всего лишь черновиком, но я надеюсь, что вы поняли:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...