2010-01-26 128 views
1

现在我在Flex中有一个Accordion组件,它有两个孩子,我想在完成实例化(在手风琴改变索引之后)时给孩子们引用我的应用程序模型。我在Flex中更新Accordion儿童的正确方法是什么?

以下符号失败,因为该事件被触发(accordionChange方法)后的孩子被实例化:

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

所以我已经现在做的是一个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"/> 
... 

我的“代码背后”类InspectorClass包含类似如下的方法:

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

这让我觉得笨拙,就像我错过了Flex的一些关键部分。我很感激任何关于我应该怎么做的建议,这似乎是对我来说重复出现的模式。

感谢,

回答

1

当您在MXML中声明它们时,您可以将每个FaceInspector实例中的模型绑定在一起。

In you FaceInspector Class(AS3/code-behind),确保您的模型属性是公共的并且可绑定的。

[Bindable] 
public var model:Model; 

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

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

我希望这是你所追求的。另外,如果您的FaceInspector实例只需要访问模型的特定属性,那么我会建议将这些属性在Model类中绑定,并直接绑定它们。例如。

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

您可以使用createpolicy的所有。在手风琴部分。

1

其实我总是看到使用事件监听器和获取对象做自己的工作,作为Flex和AS的关键概念之一。我认为你在做什么很好,但是像杜莱说的你可以加

creationPolicy="all" 

你的手风琴,然后你可以开火你的onchange事件。
例如:

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

而且顺便说一句,可能是笨拙的感觉给你的唯一原因是因为它不是您最初着手做到这一点。我知道当我需要解决某些问题时,即使解决方案优于我的初衷,我总是觉得自己是个黑客。

相关问题