繁体   English   中英

为itemRenderer灵活设置dataProvider

[英]Flex Setting dataProvider for an itemRenderer

我有一个返回xml数据的httpservice。

<mx:HTTPService id="httpService" url="data/Software.xml" resultFormat="e4x" result="httpResult_handler(event)" fault="Alert.show('XML Data Error')" />

我也有一个使用返回的数据并将其传递给完美工作的渲染器的数据网格。

<mx:DataGrid id="myDG" 
dataProvider="{httpService.lastResult.item}"
headerHeight="0"
editable="false"
width="100%" height="100%" 
rowHeight="50"
itemClick="switchView(myDG.selectedItem.name);">

<mx:columns>
<mx:DataGridColumn itemRenderer="com.xd.components.renderers.SoftwareListRenderer" />
</mx:columns>

</mx:DataGrid>

对于xml数据中的每个结果,我都有一些代码来创建新的panel()和渲染器。

private function viewstack_addChild(name:String):void {
            var p:Panel = new Panel();
            p.id = name;
            p.name = name;
            p.title = name;
            p.percentWidth = 100;
            p.percentHeight = 100;
            var randColor:uint = Math.random() * 0xFFFFFF;
            p.setStyle("backgroundColor", randColor);
            var pR:PageListRenderer = new PageListRenderer();
            var data:Object;
            //Do something to get the data to be displayed;
            pR.data = PageListRenderer;
            p.addChild(pR);
            myViewStack.addChild(p);
        }

但是,我无法在此渲染器中使用与在datagrid渲染器中相同的{data.name} 取而代之的是,我为每个字段获取“未定义” ...我该如何将{httpService.lastResult.item}传递给页面渲染器?

编辑:所做的更改。

这是httpservice结果处理程序。

        private function httpResult_handler(evt:ResultEvent):void {
            if (evt.result.software.item) {

                 data = XML(evt.result).descendants("item");
                    var item:Object = data;
                    for each(item in data) {
                        viewstack_addChild(item.name);
                    }
            }
         }

我也尝试过..

        private function httpResult_handler(evt:ResultEvent):void {
            if (evt.result.software.item) {

                 data = httpService.lastResult.item;
                     var item:Object = data;
                     for each(item in data) {
                        viewstack_addChild(item.name);
                    }
            }
         }

我还更改了viewstack_addChild函数中的pR.data = data 我仍然在datagrid中获取信息,并且在呈现的每个页面上获取数据,但是每个页面具有相同的信息(第一个结果),而不是每个页面的每个结果...

我认为问题在于您将数据设置为PageListRenderer,它可疑地看起来像一个类,而不是所需的数据。

我建议不要将dataProvider作为从http服务返回的数据,而应绑定一个变量以用于存储此数据。 然后,任何已初始化或未初始化的UI组件都可以使用它。

[Bindable]
var httpDataService:Object;

function getData():void 
{
   hpptDataService = httpService.lastResult.item;

}

数据网格...

dataprovider = "{httpDataService}"

其他UI组件

dataProvider = httpDataService

还是你的情况

 data = httpDataService

请记住,Flex将延迟控制作为惰性初始化,因此,如果您在发出HTTP请求时未初始化其他控件,那么它很不幸。 以下是来自视图堆栈参考的内容,但几乎适用于在选择之前对用户不可见的任何控件...

注意:除“应用程序”容器之外,所有容器的默认创建策略都是父容器的策略。 应用程序容器的默认策略是自动。 因此,在大多数情况下,只有选择了View Stack控件的子项之后,才能创建它们。 您不能将selectedChild属性设置为尚未创建的子级。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM