在Flex中更新Accordion儿童的正确方法是什么?

时间:2010-01-26 12:50:55

标签: flex flash

现在我在Flex中有一个带有两个孩子的Accordion组件,我希望在他们完成实例化后(在手风琴改变索引之后)给孩子们一个对我的应用程序模型的引用。

以下表示法对我来说失败,因为在事件触发后实例化子对象(accordionChange方法):

<mx:Accordion change="accordionChange(event)" > ...

所以我目前所做的是为每个Accordion子项添加一个creationComplete,然后分配模型引用:

<?xml version="1.0" encoding="utf-8"?>
<pod:InspectorClass xmlns:pod="pod.*" xmlns:mx="http://www.adobe.com/2006/mxml" >
<mx:Accordion id="accordion" color="0x323232" width="100%" height="100%">
    <mx:VBox label="Card Front" creationComplete="setChildModel()" >
        <pod:FaceInspector id="frontFaceInspector"/>
    </mx:VBox>
    <mx:VBox label="Card Back" creationComplete="setChildModel()" >
        <pod:FaceInspector id="backFaceInspector"/>
...

My“Code behind”类InspectorClass包含一个如下所示的方法:

    public function setChildModel():void
    {
        if ( accordion.selectedIndex == 0 )
        {
            frontFaceInspector.setModel(model);
        }
        else if ( accordion.selectedIndex == 1 )
        {
            backFaceInspector.setModel(model);
        }
    }

这对我来说很笨拙,就像我忽略了Flex的一些关键部分。对于我应该如何做到这一点,我将不胜感激,这对我来说似乎是一个反复出现的模式。

谢谢,

3 个答案:

答案 0 :(得分:1)

实际上,我总是看到使用事件监听器并让对象做自己的工作,作为Flex和AS的关键概念之一。我认为你所做的很好,但就像Durai说你可以添加

creationPolicy="all"

对你的手风琴然后你可以解雇你的onchange事件 例如:

<mx:Accordion id="accordion" color="0x323232" width="100%" height="100%" creationPolicy="all" change="accordionChange(event)">

顺便说一下,可能是你觉得笨拙的唯一原因是因为这不是你原本打算这样做的方式。我知道当我必须解决某些问题时,我总觉得自己就像是一个黑客,即使这种解决方法优于我的初衷。

答案 1 :(得分:1)

您可以在每个FaceInspector实例中绑定模型,就像在MXML中声明它们一样。

FaceInspector类(AS3 /代码隐藏)中,确保您的模型属性是公共的并且可绑定。

[Bindable]
public var model:Model;

然后在您的Main MXML中(或您声明FaceInspector实例的任何地方),只需将model属性绑定到模型。

<pod:FaceInspector id="frontFaceInspector" model="{model}" />

我希望这就是你所追求的目标。

此外,如果您的FaceInspector实例只需要访问模型的特定属性,那么我建议在Model Model中使这些属性可绑定,并直接绑定它们。 E.g。

<pod:FaceInspector id="frontFaceInspector" currentIndex="{model.sceneIndex}" imageURL="{model.image_url}" />

答案 2 :(得分:0)

您可以使用createpolicy作为全部。在手风琴组件中。