Помощь с контейнерами

#apache-flex #flex3

#apache-flex #flex3

Вопрос:

Я использую view stack…so при изменении вида, например, при переходе с одной страницы на другую, отправляется событие hide.Итак, я сохраняю информацию о последней странице в событии скрытия, прежде чем перейти к следующей странице. но дело в том, что если я ничего не изменю, все равно при просмотре вызывается событие скрытия и вызывается переход к серверной части … я просто хочу вызывать, только если что-то изменится в представлении .. например, текстовое значение sum…Итак, у меня есть два варианта

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

  2. прослушиватель событий на уровне контейнера .. если что-то меняется в дочерней компонентной сети через пузырящийся контейнер, он знает, отправлено ли событие 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);
}
  

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