2010-06-30 3 views
0

Краткие сведения: Я использую Flex 3.5.Flex отменяет событие изменения на дереве

У меня есть компонент дерева, который используется в качестве меню навигации между разными страницами. Когда пользователь нажимает на определенную опцию в меню, я переключаю «страницу», переключая между компонентами состояния в своем приложении. Дело в том, что когда пользователь действительно нажимает на опцию в меню, я хочу выполнить проверку некоторой информации в определенном компоненте. Если проверка не удалась, я показываю предупреждение, и я хотел бы предотвратить навигацию на другой странице. Одна часть этого просто не меняет currentState документа, но компонент дерева по-прежнему продолжается с событием изменения, и результатом является страница A, которая все еще отображается на экране, тогда как выбранная опция в дереве - страница B (к которому пользователь хотел перейти, но не удалось, поскольку некоторая информация недействительна).

Я попытался выяснить, как я могу отменить событие изменения на самом древовидном компоненте. Понятия, которые у меня были, не совсем соответствовали:

Я искал несколько другое событие (например, «change» или «startChange»), на котором я могу вызвать метод stopPropagation() (поскольку регулярное изменение 'событие не отменяется), но для компонента Дерево не существует.

Я также думал о том, что всегда сохраняю текущую опцию, выбранную в компоненте Tree, и когда проверка не выполняется, я установлю выбранный элемент Tree на эту сохраненную опцию. Это также уродливо, потому что такое действие поднимет еще одно событие изменения на дереве, таким образом, изменится состояние компонентов Штатов и другое население страницы, на которой я уже нахожусь. Это то, чего я действительно не хочу делать.

Я также об использовании другого компонента, например меню (и я также нашел реализацию вертикального меню), но это даже не помогает. Там же будет существовать такая же проблема.

Есть ли правильный способ сделать это? Должна быть лучшая практика для предотвращения совершения процесса изменения!

ответ

0
<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*"> 

    <mx:Script> 
    <![CDATA[ 
     import mx.controls.Alert; 
     import mx.events.ListEvent; 

     private function tree_changeHandler(event:ListEvent):void 
     { 
      trace("Change, selectedItem.label is: " + tree.selectedItem.label); 
     } 

     protected function tree_itemClickHandler(event:ListEvent):void 
     { 
      var data:Object = event.itemRenderer.data; 
      if (!tree.isItemSelectable(data)) 
       Alert.show("Item \"" + data.label + "\" is not selectable"); 
     } 

    ]]> 
    </mx:Script> 

    <local:MyTree id="tree" change="tree_changeHandler(event)" itemClick="tree_itemClickHandler(event)"> 
     <local:dataProvider> 
      <mx:ArrayCollection> 
       <mx:Object label="Label 1"/> 
       <mx:Object label="Label 2"/> 
       <mx:Object label="Label 3 (non-selectable)"/> 
       <mx:Object label="Label 4"/> 
      </mx:ArrayCollection> 
     </local:dataProvider> 
    </local:MyTree> 

</mx:Application> 

Источник MyTree.as:

package 
{ 
import mx.controls.Tree; 

public class MyTree extends Tree 
{ 

    override public function isItemSelectable(data:Object):Boolean 
    { 
     if (!super.isItemSelectable(data)) 
      return false; 

     var label:String = data.label; 
     if (label.indexOf("non-selectable") >= 0) 
      return false; 

     return true; 
    } 

} 
} 
0

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

Как и Максимум, я расширяю компонент Tree и переопределяю метод isItemSelectable(), чтобы проверить это свойство указанного элемента, таким образом предотвращая процесс изменения.

Доступ между представлением, в котором хранится информация, подлежащая проверке, и представление, содержащее компонент Tree (они не обязательно являются одним и тем же представлением), выполняются через класс-презентатор, который содержит оба представления (я использую MVP). Это не самый элегантный дизайн, но он намного лучше, чем все, что я мог подумать. Предполагаемая проблема с дизайном - это связь между представлениями и сложностью настоящего, который должен иметь дело с несколькими взглядами и иметь методы, связанные с взаимодействием между представлениями (вместо методов, которые представляют действия определенного Посмотреть). Дело в том, что бизнес-мудрый, два взгляда связаны (поскольку информация в одном влияет на дерево навигации в другом), таким образом, между ними существует пара.Связь также осуществляется через интерфейс настоящего, так что каждый вид не действительно «знает» другое представление.

Я надеюсь, что это может помочь другим людям.

Thanks, Daniel

Смежные вопросы