#apache-flex #flex3
#apache-flex #flex3
Вопрос:
Я использую view stack…so при изменении вида, например, при переходе с одной страницы на другую, отправляется событие hide.Итак, я сохраняю информацию о последней странице в событии скрытия, прежде чем перейти к следующей странице. но дело в том, что если я ничего не изменю, все равно при просмотре вызывается событие скрытия и вызывается переход к серверной части … я просто хочу вызывать, только если что-то изменится в представлении .. например, текстовое значение sum…Итак, у меня есть два варианта
-
используйте прослушиватель событий для каждого компонента, если что-то изменяет его, сделайте флаг true … и скройте проверку события, если флаг равен true, отправьте вызов серверной части.
-
прослушиватель событий на уровне контейнера .. если что-то меняется в дочерней компонентной сети через пузырящийся контейнер, он знает, отправлено ли событие sum.nd устанавливает флаг true.
У меня есть сомнения с контейнером…
- Могу ли я использовать container и как?
- Причина, по которой я не могу использовать container?
- Каковы плюсы и минусы в любом случае?
Комментарии:
1. Можете ли вы предоставить какой-нибудь код или описать структуру ваших компонентов и чего именно вы хотите достичь?
2. хорошо, вот моя структура кода. я использую tabnavigator. В стеке просмотра у меня есть View1 и view2. В view1 у меня есть componenet comp1 и comp2. В view2 у меня есть comp3 и comp4.при смене экрана с view1 на view2.событие hide вызывается в view1.so в этом событии я сохраняю информацию о view1, прежде чем перейду в view2. но это происходит каждый раз, даже если я ничего не меняю в view1 .. при изменении вида вызывается событие hide и запрос отправляется на серверную часть. поэтому я не хочу отправлять запрос на серверную часть, если в каком-либо компоненте нет изменений….
Ответ №1:
Я бы рекомендовал использовать dataProvider с возможностью их сравнения. Например, если вы что-то меняете с помощью textinputs, вы могли бы в принципе сделать что-то вроде этого:
[Bindable]
private var myDataProvider:Object = new Object();
private function creationCompleteHandler():void {
myDataProvider.updated = false;
myDataProvider.defaultValue = 'default';
myDataProvider.defaultValueTwo = 'default';
}
и т.д.
Тогда в вашем mxml у вас может быть что-то вроде этого:
<mx:TextInput id="myText" text="{myDataProvider.defaultValue}" change="myDataProvider.defaultValue=myText.text; myDataProvider.updated=true;" />
Наконец, в вашем событии hide вы можете выполнить следующее:
private function hideEventHandler( event:Event ):void {
if( myDataProvider.updated ){
// Call your RemoteServices (or w/e) to update the information
}
}
Таким образом, когда что-либо меняется, вы можете обновлять свой dataProvider и каждый раз получать доступ к новой информации.
Надеюсь, это поможет!
Комментарии:
1. Нет проблем, пожалуйста, отметьте мое решение как принятое, щелкнув зеленую стрелку, если оно вас устраивает.
Ответ №2:
Я использовал подход, аналогичный вашему первому варианту, в паре моих прошлых проектов. В change
случае для каждого элемента управления моей формы я вызываю небольшую функцию, которая просто устанавливает changesMade
флаг на true
в моей модели. Когда пользователь пытается перейти от моей формы, я проверяю changesMade
флаг, чтобы увидеть, нужно ли мне сохранять информацию.
Комментарии:
1. итак, какой из них является лучшим подходом, у меня есть второй вариант прослушивателя событий на уровне контейнера .. если что-то изменится в дочернем компоненте, через контейнер с пузырьками узнает, отправлено ли событие sum, и контейнер устанавливает флаг true.
Ответ №3:
Модели данных — ваш друг!
Если у вас войдет в привычку создавать строго типизированные модели данных из ваших загруженных данных, подобные вопросы становятся очень простыми.
У меня всегда есть набор привязки ключа для генерации фрагмента кода, подобного этому…
private var _foo:String;
public function get foo():String
{
return _foo;
}
public function set foo(value:String):void
{
if(_foo == value)
return;
var oldVal:String = _foo;
_foo = value;
this.invalidateProperty("foo", oldVal, value);
}
Если бы в ваших данных использовались методы получения / установки, подобные этому, было бы очень легко подтвердить изменение на уровне модели, полностью исключив представление из процесса.