Автор Оригинала:
Krxtopher
Оригинал:
Remembering TextInput values for returning users
Проблема
В Flex приложениях в отличии от стандартных (DHTML)\AJAX текстовые поля ввода не "запоминают" значения, которые пользователь ввел в них.
Решение
Создадим наследуемый от mx.controls.TextInput класс, который будет сохранять вводимые пользователем значения в SharedObject. В запусках приложения пользователем, компонент будет "забирать" значения ранее введеные пользователем.
Описание
Современные браузеры имеют запоминать введеную пользователем информацию, в текстовые поля, чтобы пользователь не перепечатывал, их каждый раз. Обычно это заметно при вводе адресса почты или пользовательского имени, по умолчанию Flex приложения не подерживают такой функционал, что в резутате может оставить не благоприятные ощущения у пользователя, который ожидает подержки данного функционала.
Приведеный ниже компонент решает эту проблему в рамках одного приложения.
Компонент наследует класс TextInput, он добавляет свойство и статический метод к API TextInput'а.
persistenceId - идентификатор хранилища с которым вы бы хотели "связать" компонент (например "login" или "email").
clearStoredValues() - очищает SharedObject.

Код:
package custom
{
import flash.events.Event;
import flash.net.SharedObject;
import mx.controls.TextInput;
public class PersistentTextInput extends TextInput
{
/**
* The ID this component will use to save and later look up its
* associated value.
*/
public var persistenceId:String = null;
/**
* The SharedObject name to use for storing values.
*/
private static const LOCAL_STORAGE_NAME:String = "persistentTextInputStorage";
/**
* Clears previously stored values for all PersistentTextInput instances.
*/
public static function clearStoredValues() :void
{
var so:SharedObject = SharedObject.getLocal(LOCAL_STORAGE_NAME);
so.clear();
}
/**
* Handles initialization of this component.
*/
override public function initialize() :void
{
super.initialize();
addEventListener(Event.CHANGE, handleChange);
restoreSavedValue();
}
/**
* Event handler function for CHANGE events from this instance.
*/
protected function handleChange(event:Event) :void
{
saveCurrentValue();
}
/**
* Restores the previously saved value associated with the
* persistenceID of with this instance.
*/
protected function restoreSavedValue() :void
{
if (persistenceId != null)
{
var so:SharedObject = SharedObject.getLocal(LOCAL_STORAGE_NAME);
var value:String = so.data[persistenceId];
if (value != null)
{
text = value;
}
}
}
/**
* Saves the text value of this instance. Associates the value with
* the persistenceId of this instance.
*/
protected function saveCurrentValue() :void
{
if (persistenceId != null)
{
var so:SharedObject = SharedObject.getLocal(LOCAL_STORAGE_NAME);
so.data[persistenceId] = text;
so.flush();
}
}
}
}
Ниже пример приложения, который показывает, как вы можете использовать компонент. Для проверки работы приложения, просто откройте его, наберите что либо в компоненте, после чего перегрузите приложение.

Код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:custom="custom.*" layout="vertical">
<mx:Script>
<![CDATA[
import custom.PersistentTextInput;
public function clearValues() :void
{
PersistentTextInput.clearStoredValues();
message.text = "A page refresh will reveal that the values have not persisted.";
}
]]>
</mx:Script>
<custom:PersistentTextInput id="firstNameInput"
persistenceId="firstName" />
<custom:PersistentTextInput id="lastNameInput" persistenceId="lastName" />
<mx:Button label="Clear Persistent Values" click="clearValues()" />
<mx:Label id="message" />
</mx:Application>
Исходник