代码之家  ›  专栏  ›  技术社区  ›  medoix

itemRenderer的Flex设置数据提供程序

  •  0
  • medoix  · 技术社区  · 16 年前

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

    我还有一个datagrid,它使用返回的数据并将其传递给渲染器,效果非常好。

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

    但是我不能用同样的方法 {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);
                        }
                }
             }
    

    我也改变了主意 pR.data = data viewstack_addChild 功能。 我仍然在datagrid中获取信息,我在每个页面上获取呈现的数据,但是每个页面都有相同的信息(第一个结果),而不是每个页面的每个结果。。。

    2 回复  |  直到 10 年前
        1
  •  0
  •   sharvey    16 年前

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

        2
  •  0
  •   AndrewB    16 年前

    我建议不要让dataProvider成为http服务返回的数据,而是绑定一个用于存储此数据的变量。然后任何UI组件都可以使用它。

    [Bindable]
    var httpDataService:Object;
    
    function getData():void 
    {
       hpptDataService = httpService.lastResult.item;
    

    .

    数据网格。。。

    dataprovider = "{httpDataService}"
    

    其他UI组件

    dataProvider=httpDataService

    还是你的情况

     data = httpDataService
    

    请记住,Flex将cotrols作为延迟初始化,因此如果您的另一个控件没有在您发出http请求时初始化,那么它就不走运了。 以下内容来自视图堆栈引用,但几乎适用于用户在选择之前不可见的任何控件。。。

    注意:除应用程序容器外,所有容器的默认创建策略都是父容器的策略。应用程序容器的默认策略为“自动”。因此,在大多数情况下,在选择视图堆栈控件的子控件之前,不会创建它们。无法将selectedChild属性设置为尚未创建的子级。

    推荐文章