我的Flex 3应用程序出了问题。
< mx:Canvas id="detailsHeader" >
< mx:HBox id="contentContainer" >
< mx:Canvas id="listContainer" />
< mx:HBox />
< mx:Canvas />
我无法通过代码动态访问“contentContainer”。 即使它创建,可见,可点击和工作。
detailsHeader.hasOwnProperty("contentContainer") == false
detailsHeader["contentContainer"] == fail(error)
detailsHeader.getChildByName("contentContainer") == null
(ReferenceError:错误#1069:在mx.containers.Canvas上找不到属性contentContainer,并且没有默认值。)
我就是不明白。 我打开每个提示。
答案 0 :(得分:0)
如果您将mxml代码调整为:
< mx:Canvas id="detailsHeader" >
< mx:HBox id="contentContainer" name="contentContainerName">
< mx:Canvas id="listContainer" />
< mx:HBox />
< mx:Canvas />
然后通过以下呼叫提供“contentContainer”:
detailsHeader.getChildByName("contentContainerName");
答案 1 :(得分:0)
使用“Name”属性来实现getChildByName,尽量不要使用objA objB keychain和child对象,然后根据开发情况明确创建所需的动态逻辑。
private function access():void
{
var objA:Object = detailsHeader.getChildByName("contentContainer");
var objB:Object = contentContainer.getChildByName("listContainer");
}
]]>
</mx:Script>
<mx:Canvas id="detailsHeader">
<mx:HBox id="contentContainer" name="contentContainer">
<mx:Canvas id="listContainer" name="listContainer">
</mx:Canvas>
</mx:HBox>
</mx:Canvas>
答案 2 :(得分:0)
其他答案没有告诉您,为什么您的代码无效。
为元素提供ID时,生成的ActionScript代码将是类级别的变量/属性。我的意思是不是被用作容器的类,而是你正在使用该元素的类。
例如:
<!-- MyGroup.mxml -->
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark">
<s:VGroup id="first">
<s:Rect id="second"/>
</s:VGroup>
</s:Group>
first
将是MyGroup
的属性,second
也是如此。 second
不是first
的属性,它是子。
当你考虑它时,它是完全合理的:假设我依赖second
作为first
的属性。当我决定不再需要first
(它毕竟只是一个布局类)并删除它时,所有引用second
的代码都会中断,因为它无法再访问同样的方式
但是,如果second
属于MyGroup
属性,则您只需删除first
,并且与second
相关的所有代码都会继续正常工作,就好像什么也没发生一样。
作为一个结论,虽然引用getChildByName
的答案在技术上是正确的,但从维护的角度来看,我认为你不应该这样编码。