2009-08-09 1 views
1

Я разрабатываю приложение flex с 4 вкладками. Когда пользователь переключает вкладку, я хочу сбросить предыдущую вкладку до ее начального состояния. Также мне нужно предупредить пользователя, если он не сохранил внесенные изменения, если они есть, будет потерян.Flex - проверка на изменение полей под вкладкой

Я планирую установить переменную в Модели и установить/сбросить ее, если какие-либо изменения произойдут в поле под вкладкой. Но как я могу контролировать это? Есть ли для этого слушатель?

Также как проверить и сбросить состояние предыдущей вкладки? Содержимое, попадающее под вкладку, относится только к компонентам.

[EDIT] Мои вопросы:

  1. Как проверить, если пользователь вносил изменения в текущей вкладке? Некоторые поля генерируются динамически.
  2. Я вызываю функцию в событии onchange TabNavigator и спрашиваю пользователя, действительно ли он хочет переключить вкладку. Я хочу, чтобы другая вкладка загружала ее содержимое только в том случае, если пользователь нажимает «Да» в поле «Предупреждение». Я выскользнуть. Но теперь появляется окно подтверждения, и содержимое загружается на другую вкладку, и если пользователь нажимает «Нет», он возвращается на другую вкладку. Как предотвратить загрузку содержимого другой вкладки до тех пор, пока пользователь не нажмет «Да»?

Просьба предоставить ценные данные.

ответ

1

Для 1) вы можете отправлять событие каждый раз, когда пользователь редактирует поле. Событие может быть обработано командой, которая будет обновлять некоторые свойства в вашей модели с правильной информацией о том, что было обновлено. Тогда любой, кто заботится по вашему мнению, может связываться с этими свойствами.

Для 2) в вызове обработчика onChange() event.preventDefault(). Затем вы можете программно выбрать следующую вкладку, только если пользователь нажимает «Да».

2

Ответ на вопрос 1 следующий: Используйте логическую переменную для отслеживания, если пользователь отредактировал данные. Когда пользователь выбирает вкладку, установите для этой переменной значение false. Прослушайте событие изменения во всех полях на вкладке. Установите обработчик события изменений для всех полей как метод, который устанавливает логическое значение в значение true. Для динамических полей добавьте тот же обработчик события изменения, что и другие поля. Сделайте это, как только вы создадите каждое динамическое поле. См. Код ниже;

<?xml version="1.0"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:Script> 
     <![CDATA[ 
      private var userChangedData:Boolean=false 

      function onUserChangedData() 
      { 
       trace("onUserChangedData") 
       userChangedData=true 
      } 

      function onTabChanged() 
      { 
       trace("ontabchanged") 
       trace(userChangedData) 
       userChangedData=false 
      } 
     ]]> 
    </mx:Script> 
    <mx:Panel title="TabNavigator Container Example" 
       height="90%" 
       width="90%" 
       paddingTop="10" 
       paddingLeft="10" 
       paddingRight="10" 
       paddingBottom="10"> 

     <mx:TabNavigator id="tn" 
         width="100%" 
         height="100%" 
         change="onTabChanged()"> 
      <!-- Define each panel using a VBox container. --> 

      <mx:VBox label="Panel 1"> 
       <mx:Label text="TabNavigator container panel 1"/> 
       <mx:TextInput text="default" 
           change="onUserChangedData()"/> 
       <mx:CheckBox label="check something" 
          change="onUserChangedData()"/> 
      </mx:VBox> 

      <mx:VBox label="Panel 2"> 
       <mx:Label text="TabNavigator container panel 2"/> 
      </mx:VBox> 

      <mx:VBox label="Panel 3"> 
       <mx:Label text="TabNavigator container panel 3"/> 
      </mx:VBox> 
     </mx:TabNavigator> 


    </mx:Panel> 

+0

Можно ли добавить глобальный метод onchange/onkeypress, который перехватывает все приложение и устанавливает логическое значение? В противном случае мне придется редактировать в нескольких местах, чтобы добавить событие onchange. – jobinbasani

+0

Спасибо за решение. Но настройка обработчика события onchange не будет хорошо работать для TabNavigator. Я нашел решение здесь по адресу http://natescodevault.com/?p=43, и он тоже хорошо работает ... – jobinbasani

+0

Интересно. Не понял, что о событии изменения для навигатора вкладок –

0

У меня нет репутации добавлять комментарии пока нет, но ответить на ваш вопрос:

«Можно ли добавить глобальный OnChange/OnKeyPress метод, который перехватывает к полное приложение и устанавливает логическое значение? В противном случае мне придется редактировать в нескольких местах, чтобы добавить событие onchange. - Basani «

Да, есть каждое место, которое должно сигнализировать о том, что« что-то изменилось »отправляет Еву нт. Затем попросите команду наблюдать за отправками этого события. Эта команда может выполнить всю необходимую вам обработку, включая установку логического элемента userDataChanged в модели.

Похоже, вы используете Cairngorm на основе того, как вы отметили этот вопрос, поэтому его следует легко поддерживать.