【问题标题】:How to access MXML component instance in ItemRenderer如何在 ItemRenderer 中访问 MXML 组件实例
【发布时间】:2014-04-02 17:09:40
【问题描述】:

我一直在开发基于 Adob​​e Flex (v3.5 Flex SDK) 的应用程序,我有一个关于如何从 ItemRenderer 文件访问(调用)以 MXML 文件(嵌入脚本标签)编写的方法的问题。

MXML 组件有一个数据网格,对于其中一列,itemrenderer 是我自己的自定义项渲染器。

在我的自定义项渲染器中,对于某些事件,我需要调用其父 MXML 组件中存在的方法。我们如何访问它的父 MXML 实例?

我在 google 中对此进行了探索,发现我们可以访问引用数据网格的 dataProvider 的“数据”对象。但我想访问具有数据网格的 MXML 组件实例(以便我可以在其中调用方法)。

AdvancedDataGrid中的AdvancedDataGridColumn是这样的

<mx:AdvancedDataGridColumn dataField="total" headerText="Total" width="120" itemRenderer="renderers.MyItemRenderer"/>

这里MyItemRenderer是一个单独的动作脚本文件。

感谢您的回复。

谢谢

拉古

【问题讨论】:

  • 您是否在数据网格中使用内部 MXML 组件作为 MXML 组件中的项目渲染器?
  • 顺便说一句,您应该发布您的代码。
  • 没有。我有 ItemRenderer 的单独操作脚本文件
  • 您可以从项目渲染器中调度 AdvancedDataGrid 上的自定义事件并监听它。就我个人而言,我不喜欢在我的项目渲染器中包含太多逻辑:它们只是渲染器而不是组件。这样您就可以在其他情况下轻松地重用您的项目渲染器(并且不实施分叉,因为行为不一样)。
  • 好的。明白你的意思了。我也可以这样使用吗?在 ItemRenderer 的 listData(value:BaseListData) 方法中,AdvancedDataGridListData(value).owner.owner ?第一个所有者是指 AdvancedDataGrid,它的所有者是指 MXML 组件?

标签: apache-flex mxml itemrenderer advanceddatagrid


【解决方案1】:

正如 Raghavendra Nilekani 建议的那样,这很有效:

TestGrid.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Script>
        <![CDATA[
            [Bindable]
            public var data:Array  = [
                {name:"name",value:"valeu1",timestamp:"423423"},
                {name:"name1",value:"valeu2",timestamp:"423423"},
                {name:"name2",value:"valeu3",timestamp:"423423"},
                {name:"name3",value:"valeu5",timestamp:"423423"}
            ]

            public function calculateValue():Number{
                return Math.random();
            }   
        ]]>
    </fx:Script>
    <fx:Declarations>

    </fx:Declarations>
        <mx:VBox height="100%" width="100%">
            <mx:AdvancedDataGrid dataProvider="{data}">
                <mx:columns>
                    <mx:AdvancedDataGridColumn itemRenderer="ItemRenderer">

                    </mx:AdvancedDataGridColumn>
                </mx:columns>
            </mx:AdvancedDataGrid>

        </mx:VBox>
</s:Application>

e ItemRendere.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:MXAdvancedDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                                  xmlns:s="library://ns.adobe.com/flex/spark" 
                                  xmlns:mx="library://ns.adobe.com/flex/mx" 
                                  focusEnabled="true"
                                  addedToStage="mxadvanceddatagriditemrenderer1_addedToStageHandler(event)"
                                  >

    <fx:Script>
        <![CDATA[
            [Bindable]
            var value:Number;
            import mx.containers.VBox;
            import mx.controls.AdvancedDataGrid;
            protected function mxadvanceddatagriditemrenderer1_addedToStageHandler(event:Event):void
            {
                var grid:AdvancedDataGrid = ((AdvancedDataGrid)(this.owner));
                var box:VBox =  ((VBox)(grid.owner))        
                    var comp:TestGrid  = (TestGrid)(box.owner);
                    value = comp.calculateValue();
            }
        ]]>
    </fx:Script>


    <s:Label id="lblData" top="0" left="0" right="0" bottom="0" text="{value}" />
</s:MXAdvancedDataGridItemRenderer>

无论如何,我同意 zenbeni 的观点,即这会导致不可重用的项目渲染器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2013-01-12
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多