Apache flex 从Flex中的自定义IconItemRenderer中访问导航器

Apache flex 从Flex中的自定义IconItemRenderer中访问导航器,apache-flex,flash-builder,Apache Flex,Flash Builder,我在Flex中有一个类,它通过扩展IconItemRenderer基类来包装定制的IconItemRenderer。我正在列表中使用此自定义项,并收听鼠标按键。根据鼠标按下的位置,我有不同的选项。其中之一是导航到不同的视图。我知道如何使用列表的更改侦听器来推送到新视图,但不想实现它。鼠标点击的想法是,根据位置,我可以从列表中删除元素或打开当前元素 在我的一生中,我找不到一种从IconItemRenderer中导航到新视图的方法。这是我正在使用的代码,包括我实现它的类和列表 名单 <s:Li

我在Flex中有一个类,它通过扩展IconItemRenderer基类来包装定制的IconItemRenderer。我正在列表中使用此自定义项,并收听鼠标按键。根据鼠标按下的位置,我有不同的选项。其中之一是导航到不同的视图。我知道如何使用列表的更改侦听器来推送到新视图,但不想实现它。鼠标点击的想法是,根据位置,我可以从列表中删除元素或打开当前元素

在我的一生中,我找不到一种从IconItemRenderer中导航到新视图的方法。这是我正在使用的代码,包括我实现它的类和列表

名单

<s:List id="survey_list" visible="true" width="98%"  height="70%" contentBackgroundColor="#FFFFFF" horizontalCenter="0">            
    <s:itemRenderer>
        <fx:Component>
            <components:DeleteItemRenderer width="99.9%" height="98%" verticalAlign="top" click="detectActionPress();">
                <fx:Script>
                    <![CDATA[
                        import spark.components.ViewNavigator;
                        import spark.components.View;
                        import mx.events.FlexEvent;
                        import mx.core.FlexGlobals;
                        import mx.core.UIComponent;
                        import spark.components.List;

                        private var application:UIComponent = FlexGlobals.topLevelApplication as UIComponent;
                        private var pressOpen:Number = application.width - 40;
                        //private var _navigator:ViewNavigator = FlexGlobals.topLevelApplication.navigation; //navigation is not defined uhhhh why????

                        private function detectActionPress():void{
                            var localX:Number = this.mouseX;
                            if(localX <= pressOpen){
                                engangeElement();
                            }
                            else{
                                deleteElement();
                            }
                        }

                        private function deleteElement():void{
                            var parentList:List = owner as List;
                            parentList.dataProvider.removeItemAt(parentList.dataProvider.getItemIndex(data));                               
                            trace('element removed');
                        }

                        private function engangeElement():void{
                            var parentList:List = owner as List;

                            var _test:ViewNavigator = this.parentDocument as ViewNavigator;

                            //this.parentApplication.navigator.pushView(views.UnfinishedSurvey, parentList.selectedItem.shortcode)
                            _test.pushView(views.UnfinishedSurvey, parentList.selectedItem.shortcode);
                        }
                    ]]>
                </fx:Script>
            </components:DeleteItemRenderer>
        </fx:Component>
    </s:itemRenderer>       
</s:List>

你知道我如何从
engageElement()推出一个新视图吗
为什么我不能访问导航器


感谢大家

;我建议从itemRenderer内部调度一个事件。确保事件发生泡泡

您可以侦听作为itemRenderer/List的分层父级的类上的事件

在事件处理程序中,您可以访问导航器

我写了一篇关于;这可能会提供更多的细节


有其他方法可以做到这一点。可以使用具有导航器实例的类,并使用某种类型的依赖项注入(DI)框架将其注入渲染器。Robotlegs和Swiz是两个基于ActionScript的框架,支持这一点。

这有帮助吗?通常地从itemRenderer调度冒泡事件,并访问事件处理程序中的导航器。或者,您可以使用具有导航器实例的类,并使用某种类型的依赖项注入(DI)框架将其注入渲染器。Robotlegs和Swiz是两个支持DI@www.Flextras.com在您的教程之后出现了一些问题(必须创建自定义类,但成功地做到了,而且效果非常好)。能否请您添加您的评论作为答案,以便我可以验证它?这是一篇非常好的文章,我相信其他人也会使用它。谢谢,我很高兴这有帮助。本教程旨在概述这些方法,而无需深入研究代码。我写了这篇文章,这样我就不必再用正式的答案来解释了。:-)
<s:List id="survey_list" visible="true" width="98%"  height="70%" contentBackgroundColor="#FFFFFF" horizontalCenter="0">            
    <s:itemRenderer>
        <fx:Component>
            <components:DeleteItemRenderer width="99.9%" height="98%" verticalAlign="top" click="detectActionPress();">
                <fx:Script>
                    <![CDATA[
                        import spark.components.ViewNavigator;
                        import spark.components.View;
                        import mx.events.FlexEvent;
                        import mx.core.FlexGlobals;
                        import mx.core.UIComponent;
                        import spark.components.List;

                        private var application:UIComponent = FlexGlobals.topLevelApplication as UIComponent;
                        private var pressOpen:Number = application.width - 40;
                        //private var _navigator:ViewNavigator = FlexGlobals.topLevelApplication.navigation; //navigation is not defined uhhhh why????

                        private function detectActionPress():void{
                            var localX:Number = this.mouseX;
                            if(localX <= pressOpen){
                                engangeElement();
                            }
                            else{
                                deleteElement();
                            }
                        }

                        private function deleteElement():void{
                            var parentList:List = owner as List;
                            parentList.dataProvider.removeItemAt(parentList.dataProvider.getItemIndex(data));                               
                            trace('element removed');
                        }

                        private function engangeElement():void{
                            var parentList:List = owner as List;

                            var _test:ViewNavigator = this.parentDocument as ViewNavigator;

                            //this.parentApplication.navigator.pushView(views.UnfinishedSurvey, parentList.selectedItem.shortcode)
                            _test.pushView(views.UnfinishedSurvey, parentList.selectedItem.shortcode);
                        }
                    ]]>
                </fx:Script>
            </components:DeleteItemRenderer>
        </fx:Component>
    </s:itemRenderer>       
</s:List>