FLEX - Открытие веток деревьев ..? - PullRequest
0 голосов
/ 12 января 2012

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

Если я нажимаю на «папку» или ветвь (по указанному имени), она открывается нормально и закрывает другие открытые папки / ветви, у которых есть такой же родитель.

НО, если я нажму на маленькую стрелочку впереди, я получу ошибку.

<mx:Tree id="treeView" x="0" y="0" width="100%" height="100%"
                             itemRenderer="components.CustomTreeItemRenderer"
                             paddingBottom="2" showRoot="true"
                             itemClick="treeItemClick(event)"
                             itemOpen="treeItemOpen(event)" />

        public function treeItemOpen(event:Event):void {
            var a:Array=openParent(event.currentTarget.selectedItem, [event.currentTarget.selectedItem]);
            if(a) treeView.openItems = a;
        }

        public function openParent(o:Object,a:Array):Array{
            if( o.parent()){
                a.push(o.parent());
                a=openParent(o.parent(),a);
            }
            return a;
        }

Это сообщение об ошибке, которое я получаю:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Test_tree_001/openParent()[D:\Flash Builder - Workspace\vCog Workspace\vCog Flash 14-12-2011 - SWF\src\Test_tree_001.mxml:212]
at Test_tree_001/treeItemOpen()[D:\Flash Builder - Workspace\vCog Workspace\vCog Flash 14-12-2011 - SWF\src\Test_tree_001.mxml:207]
at Test_tree_001/__treeView_itemOpen()[D:\Flash Builder - Workspace\vCog Workspace\vCog Flash 14-12-2011 - SWF\src\Test_tree_001.mxml:705]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\hero_private\frameworks\projects\framework\src\mx\core\UIComponent.as:13128]
at mx.controls::Tree/http://www.adobe.com/2006/flex/mx/internal::dispatchTreeEvent()[E:\dev\hero_private\frameworks\projects\mx\src\mx\controls\Tree.as:3551]
at mx.controls::Tree/http://www.adobe.com/2006/flex/mx/internal::onTweenEnd()[E:\dev\hero_private\frameworks\projects\mx\src\mx\controls\Tree.as:2381]
at mx.effects::Tween/endTween()[E:\dev\hero_private\frameworks\projects\framework\src\mx\effects\Tween.as:566]
at mx.effects::Tween/http://www.adobe.com/2006/flex/mx/internal::doInterval()[E:\dev\hero_private\frameworks\projects\framework\src\mx\effects\Tween.as:607]
at mx.effects::Tween$/timerHandler()[E:\dev\hero_private\frameworks\projects\framework\src\mx\effects\Tween.as:191]
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

EDIT

У меня тоже есть этот код, который открывает ветку, если я нажимаю на текст. Почему-то я все еще получаю ошибки с новым кодом.

if (treeView.dataDescriptor.isBranch(selectedItem)){  
                trace("isBranch: Triggered in treeItemClick!");
                treeView.expandItem(selectedItem,!treeView.isItemOpen(selectedItem),false,true);
                }

Это ошибка, которую я получаю с новым кодом:

TypeError: Error #1010: A term is undefined and has no properties.
at Test_tree_001/treeItemClick()[D:\Flash Builder - Workspace\vCog Workspace\vCog Flash 14-12-2011 - SWF\src\Test_tree_001.mxml:411]
at Test_tree_001/__treeView_itemClick()[D:\Flash Builder - Workspace\vCog Workspace\vCog Flash 14-12-2011 - SWF\src\Test_tree_001.mxml:734]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\hero_private\frameworks\projects\framework\src\mx\core\UIComponent.as:13128]
at mx.controls.listClasses::ListBase/mouseClickHandler()[E:\dev\hero_private\frameworks\projects\mx\src\mx\controls\listClasses\ListBase.as:10328]
at mx.controls::Tree/mouseClickHandler()[E:\dev\hero_private\frameworks\projects\mx\src\mx\controls\Tree.as:3129]

1 Ответ

0 голосов
/ 13 января 2012

Вы получаете это сообщение об ошибке, потому что объект o, который передается методу openParent, является нулевым. Поскольку не передается допустимый объект, Flex не может оценить свойство parent.

Моя лучшая догадка - потому что при нажатии на стрелку нет selectedItem, поэтому event.currentTarget.selectedItem всегда будет null Вам нужно будет найти другой способ определить, какой узел был выбран.

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

Этот код не работает для меня, потому что я не хочу открывать / закрывать элементы если я нажимаю на них, я хочу, чтобы они открывались / закрывались, если я нажимал плюс / минус. Код, который работал для меня:

protected function tree_itemOpenHandler(event:TreeEvent):void { 
  tree.openItems =[event.item,event.item.parent(),event.item.parent().parent(), event.item.parent().parent().parent()]; 
} 

Это обрабатывает деревья, которые идут на 3 уровня глубиной, если у вас, например, есть Дерево с 4 уровнями, вы должны добавить еще один: event.item.parent().parent().parent().parent()

Надеюсь, это поможет вам начать в правильном направлении.

...