Привязка данных Flex повторная, когда модель данных не меняется, возможно? - PullRequest
0 голосов
/ 04 ноября 2011

Существует общий случай, когда я связываю значение модели данных с элементом управления GUI, скажем, с TextInput.Модель данных извлекается из бэкэнда.

Если пользователь изменит значение TextInput, затем нажмите кнопку обновления, чтобы снова получить модель данных из бэкэнда, значение графического интерфейса не изменится обратно.Повторного связывания не происходит, так как значение модели данных не изменилось, событие propertyChanged не сработало.

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

Я знаю, что двунаправленное связывание может решить эту проблему (когда пользователь меняет значение в графическом интерфейсе, немедленно установите новое значение для модели данных).Но иногда я не могу использовать двунаправленную привязку, например, модель данных - это int, но пользователь вводит не-int значение, я не могу установить значение для модели данных.Таким образом, значение в модели данных не изменяется, при обновлении данных повторное связывание все равно не происходит.

Это сделает привязку данных бесполезной.Как решить эту проблему?

Я сейчас покажу здесь псевдокод, позже я добавлю реальный код:

1. retrieve a data model from server, via blazeds or something else.
2. bind the model to a TextInput on GUI.
3. user change the TextInput text.
4. User click a refresh button, triger retrieve the model value again.
5. Now since the model value do not change, no PropertyChanged event fired.
6. GUI value still is the user's input, not the value from the model.

Я могу очистить значение модели, прежде чем вернуть значение обратно, сделать заново-привязка происходит (но иногда вы не знаете, как очистить значение модели, например, взять int, вы можете не знать исходное значение и установить одно и то же значение).Или я могу вручную установить значение модели в GUI.Но оба не очень хорошо выглядят.Двунаправленное связывание не работает, так как, если пользователь ввел недопустимое значение, я не могу установить его для модели.Значения модели не меняются, повторного связывания не произойдет.

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Двунаправленное связывание может быть достигнуто различными способами, не обязательно с @ -символом В вашем конкретном случае вам нужно использовать Binding-tag:

<fx:Binding source="parseInt(someNumberInput.text)"
    destination="someModel.someNumberValue"/>

<s:TextInput id="someNumberInput" text="{someModel.someNumberValue}"/>

Очень важно не забыть parseInt() числовое значение.

1 голос
/ 04 ноября 2011

Вы можете отправлять события привязки в любое время.Один из способов - просто отправить PropertyChangeEvent для всех свойств, которые вы хотите обновить, а другой - добавить собственное событие привязки в дополнение к стандартному связыванию.

Например, я думаю, что это будет работать:

[Bindable]
[Bindable (event="allChanged")]//make sure to dispatch this yourself when everything changes
public var myInt:int;

Существует вероятность того, что событие пользовательского связывания может помешать Flex сгенерировать код в фоновом режиме, который выполняет стандартное связывание (я никогда не делал выше, потому что, если я собираюсь использовать пользовательские события, я склонен неиспользуйте стандартную привязку).

Flash Builder 4.5 имеет потрясающую генерацию кода, поэтому вы можете просто преобразовать открытую переменную в метод получения и установки, и он спросит вас, хотите ли вы запустить пользовательское событие для свойства,Если вы установите этот флажок, он напишет код для вас.Затем вы добавляете второй тег метаданных вручную.

Метод getter / setter будет работать лучше, потому что тогда каждое свойство будет иметь свое собственное событие, а не все из них, вызывая propertyChange и проверяя, является ли свойствоправильный.Но другой менее многословен и более удобен в обслуживании, если он работает.

0 голосов
/ 04 ноября 2011

Используйте соответствующий редактор для редактирования числового значения.Флекс не может угадать, что ты хочешь делать.

...