FLEX - 打开树枝..?

发布于 2024-12-26 04:13:27 字数 3656 浏览 2 评论 0 原文

我一直在使用这段代码来帮助在我的树组件中进行导航,但我确实遇到了一个问题。

如果我单击“文件夹”或分支(在列出的名称处),它会正常打开,并关闭具有相同父级的其他打开的文件夹/分支。

但是,如果我单击前面的小箭头,则会出现错误。

<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()

编辑

我也有此代码,如果我单击文本,它将打开分支。 不知怎的,我仍然收到新代码的错误。

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]

I've been using this code to help with navigation in my tree component, but I do have one problem.

If I click on a "folder", or branch, (at the name listed) it opens up fine, and closes other open folders/branches that has the same parent.

BUT, if I click on the little arrow in front I get an error.

<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;
        }

This is the error message I get:

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

I have this code too, which opens up the branch if I click the text.
Somehow I still get errors with the new code.

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

This is the error I'm getting with the new code:

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]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤檠 2025-01-02 04:13:27

您收到该错误消息是因为传递给 openParent 方法的对象 o 为 null。由于没有传递有效对象,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()

希望这可以帮助您朝着正确的方向开始。

You're getting that error message because the Object o that's getting passed to the openParent method is null. Because there's no valid object getting passed Flex can't evaluate the parent property.

My best guess is because when clicking on the arrow there is no selectedItem so event.currentTarget.selectedItem will always be null. You'll have to find another way of identifying which node was selected.

I did some quick Googling and found this article. The last comment in that article mentioned:

This code didn’t work for me because I don’t want to open/close items
if I click them, i want them to open/close if I click the plus/minus.
The code that did work for me:

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

This handles trees that go 3 levels deep, if you for example have a
tree with 4 levels, you have to add another:
event.item.parent().parent().parent().parent()

Hopefully this helps get you started in the right direction.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文