动态生成的MXML数据无法呈现

时间:2015-07-14 05:09:34

标签: actionscript-3 flex flex3 mxml

所以我需要在视图中显示动态生成的数据。

为此,我的想法是创建一个mxml文件,然后将其用作对象。填写ibject中的数据,然后使用addChild显示它。但即使在添加了所有数据之后。动态生成的mxml文件不会显示。

代码

BuyTogetherGrid.MXML

<?xml version="1.0" encoding="utf-8"?>
<mx:Box xmlns:mx="http://www.adobe.com/2006/mxml" width="80" height="60" xmlns:image="org.commodity.detail.image.*">
<mx:HBox>
    <image:ImageBox id="buyTogetherImg"></image:ImageBox>
    <mx:VBox id="textInfo">
        <mx:Box id="commonNameBox">
            <mx:Label id="commonName">
            </mx:Label>
        </mx:Box>
        <mx:Box id="commonPriceBox">
            <mx:Label id="commonPrice">
            </mx:Label>
        </mx:Box>
    </mx:VBox>
</mx:HBox>
<mx:Script>
    <![CDATA[
        public function createGrid():void{
            this.buyTogetherImg = new ImageBox();
            this.commonName = new Label();
            this.commonPrice = new Label();
        }

    ]]>
</mx:Script>
</mx:Box>

这是我的MXMl文件。我的想法是创建这个mxml对象的对象。将数据添加到buyTogetherImg,CommonName,CommonPrice,然后使用addChild

我设置数据的部分

<mx:HBox id="buyTogetherBox" width="100%" borderColor="black">

</mx:HBox>

上层HBox是我将保留所有生成对象的容器

var buyTogetherBox : BuyTogetherGrid = new BuyTogetherGrid();
buyTogetherBox.createGrid();

for each(var item:cmListItem in commod.items){
       if(item.dataFormat == 2){
           buyTogetherBox.buyTogetherImg.imgData = item.value as ImageData;
       } else if(item.dataFormat == 0){
          buyTogetherBox.commonName.text = item.value.toString();
       } else if(item.dataFormat == 3){
            buyTogetherBox.commonPrice.text = StringUtil.numToStrPrice(item.value as Number);
                    }
       }
       this.buyTogetherBox.addChild(buyTogetherBox);
}

代码检查一些条件并添加数据。但是,buyTogetherBox不可见。但是如果我尝试像

那样的话
this.buyTogetherBox.addChild(buyTogetherBox.buyTogetherImg);

然后我可以看到H:Box中的图像。

我是Flex的新手。也许我会错过一些东西

2 个答案:

答案 0 :(得分:0)

您将保留静态创建的标签和图像控件实例,而不是创建新实例。基本上,整个createGrid()函数是不必要的。您已经在MXML中创建了控件。只需使用它们创建新实例。

var grid:BuyTogetherGrid = new BuyTogetherGrid();
grid.addEventListener(FlexEvent.CREATION_COMPLETE, this.grid_creationCompleteHandler);

在同一个班级的其他地方......

private function grid_creationCompleteHandler(event:FlexEvent):void
{
    // Set your properties here
}

答案 1 :(得分:0)

正如Pranav所说,创建MXML组件需要一些时间,如果您尝试立即评估它们,您将获得空指针异常,因为它们还不存在。一个快速而肮脏的解决方案是在BuyTogetherGrid.MXML中创建公共变量,然后将文本属性绑定到这些变量,例如

<?xml version="1.0" encoding="utf-8"?>
<mx:Box xmlns:mx="http://www.adobe.com/2006/mxml" width="80" height="60" xmlns:image="org.commodity.detail.image.*">

<fx:Script>
    <![CDATA[

[Bindable] public var imageData:ImageData;
[Bindable] public var name:String;
[Bindable] public var price:String;

    ]]>
</fx:Script>

<mx:HBox>
    <image:ImageBox id="buyTogetherImg" imgData={imageData}/>
    <mx:VBox id="textInfo">
    <mx:Box id="commonNameBox">
        <mx:Label id="commonName" text="{name}">
        </mx:Label>
    </mx:Box>
    <mx:Box id="commonPriceBox">
        <mx:Label id="commonPrice" text="{price}">
        </mx:Label>
    </mx:Box>
</mx:VBox>

然后你做

buyTogetherBox.imageData = yourImageData;
buyTogetherBox.name = "Your Name";
buyTogetherBox.imageData = "Your price";

是的,删除不必要的createGrid()方法