【问题标题】:flex custom event with item renderer and custom component带有项目渲染器和自定义组件的 flex 自定义事件
【发布时间】:2014-01-19 08:17:52
【问题描述】:

好的,Flex 专家,我需要一些帮助。我的主应用程序中有一个带有 itemrenderer (mxml) 的数据网格。当您按下 ir 中的图像时,将打开一个自定义组件 (mxml)。 cc 有一个按钮,它应该调用主应用程序中的一个函数,该函数更新arraycollection(dataprovider)并因此更新datagrid。我尝试了几种 parentDocument、outerDocument 和自定义事件的变体,但我无法通过按钮使该功能起作用。我认为这是 b/c 我将 cc 嵌套在 ir 中。我直接从他们的作品中调用的任何内容。

有没有人有任何建议或者更好的工作示例我可以看看?

这是我尝试过的:

//在主应用程序中

public function creationComplete_handler(event:FlexEvent):void{
   dgList.addEventListener("ceRD", fnt_ceRD);
}
public function fnt_ceRD():void {
    Alert.show("called");
}


<mx:AdvancedDataGrid id="dgList" dataProvider="{acLists}" designViewDataType="flat">
   <mx:columns>
      <mx:AdvancedDataGridColumn headerText="Roster" sortable="false" itemRenderer="c_CO.AppLocal.ListManager.iRenderers.irADVStudents" />   </mx:columns>
</mx:AdvancedDataGrid>

在 itemrenderer 中,使用了 popupmanager,这样我就可以将中心放在应用程序的顶部,而不是 datagrid 中的按钮

public function btnRoster(event:MouseEvent):void{
    var rShow:rosterDetails = new rosterDetails();
    PopUpManager.addPopUp(rShow, FlexGlobals.topLevelApplication.mainContent, true);
    PopUpManager.centerPopUp(rShow);
}

在自定义组件中:

 <fx:Metadata>
        [Event("ceRD", true, false)]
    </fx:Metadata>

    <fx:Script>
        <![CDATA[
        import flash.events.Event;

            protected function btnSave(event:MouseEvent):void {

            var i_ceRD:Event = new Event("ceRD");
            dispatchEvent(i_ceRD);
            PopUpManager.removePopUp(this);

        }

        ]]>
    </fx:Script>

【问题讨论】:

  • 请告诉我们您尝试了什么?在大多数情况下,我建议在渲染器中使用自定义事件 [确保气泡属性设置为 true];然后在 DataGrid 上为事件添加一个侦听器[您可以在 DataGrid 的初始化事件中这样做]

标签: apache-flex itemrenderer custom-events


【解决方案1】:

您遇到了麻烦,因为“ceRD”的侦听器在从名册详细信息组件分派事件时添加到 DataGrid。 DataGrid 和 RosterDetails 之间没有关系。

考虑将创建和显示RosterDetails 的逻辑移出ItemRenderer。我建议让irADVStudents 渲染器调度一个可以在您的主应用程序中处理的“imageClick”事件。

内联渲染器有助于添加简单的事件处理:

<mx:AdvancedDataGrid dataProvider="{acLists}">
    <mx:columns>
        <mx:AdvancedDataGridColumn headerText="Roster" sortable="false">
            <mx:itemRenderer>
                <mx:Component>
                    <local:irADVStudents imageClick="outerDocument.onRoster(event)"/>
                </mx:Component>
            </mx:itemRenderer>
        </mx:AdvancedDataGridColumn>
    </mx:columns>
</mx:AdvancedDataGrid>

然后您可以简单地为您的“保存”事件添加一个侦听器。确保删除侦听器,因为这是潜在的内存泄漏。 (弱侦听器也是一种选择)。

public function onRoster(event : Event) : void
{
    var rosterDetails : RosterDetails = new RosterDetails();
    rosterDetails.addEventListener("save", onSave);

    PopUpManager.addPopUp(rosterDetails, this, true);
    PopUpManager.centerPopUp(rosterDetails);
}

protected function onSave(event:Event):void
{
    Alert.show("SAVED");
}

自定义事件可用于在应用程序中传递数据,例如从渲染器中单击了哪个项目。

【讨论】:

  • 我听取了您的建议,删除了正式的 mxml itemrenderer,只使用了一个直接的图像标签,点击事件处理程序通过 outerDocument 调用函数。然后我添加了现在由顶级应用程序拥有的自定义组件。这允许我在组件中添加自定义事件。宇宙再次一切安好。感谢您的建议和帮助!!!
猜你喜欢
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
相关资源
最近更新 更多