我发现Flex SDK 4.1和4.5之间的parentDocument
存在一些不一致。简而言之,在4.1(和4.6)中打破了在4.1中工作的现有代码。以下是一个小例子来说明:
TestProject.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="500" minHeight="500" xmlns:local="*">
<local:SubComponent x="50" y="50"/>
</s:Application>
SubComponent.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="200" height="200">
<fx:Script>
<![CDATA[
import spark.components.Application;
protected function button1_clickHandler(event:MouseEvent):void
{
var app:Application = this.parentDocument as Application;
if (app != null) {
trace('Good');
} else {
trace('Bug');
}
}
]]>
</fx:Script>
<s:Button x="18" y="20" label="Button" click="button1_clickHandler(event)"/>
</s:Group>
使用4.1 SDK,我成功地通过Application
检索parentDocument
对象。但是,4.5 SDK失败了。使用4.5,parentDocument
现在是皮肤对象:
"parentDocument" spark.skins.spark.ApplicationSkin (@9d7e479)
如果我上升两个级别,那么我成功获取了Application对象:
"parentDocument.parentDocument" TestProject (@9d7e0a1)
因此,我可以通过将parentDocument
替换为parentDocument.parentDocument
来解决此问题。但是,我不清楚这种变化是否是我可以指望一直向前发展的预期行为,或者是否是一个可能在将来某个时候修复的错误,此时行为将恢复到4.1的方式做事。所以,我的问题是:
请注意,我上面的示例旨在用最少的代码和最小的复杂性来演示问题。在我的实际项目中,我有一个包含带有子组件的TitleWindow
的模块,我正在尝试让子组件调用TitleWindow
中的方法(通过parentDocument
)。因此,涉及查找Application
对象的其他方法的变通方法并不真正适用,因为子组件实际上正在寻找TitleWindow
,而不是Application
。
答案 0 :(得分:2)
是的,这不是一个错误。这实际上是火花组件的“特征”。基本上,对于SkinnableContainers(TitleWindow是),子节点实际上被添加到组件外观的contentGroup中。有一些好文章解释了所有at this link和also this one。在许多场景中,您可以快速将代码更改为.owner属性(只要子对象是DisplayObject),以实现所需的结果。更好的方法可能是重构一些代码以更好地适应皮肤提供的视图封装(让子组件触发事件而不是尝试访问父级的方法......那种事情)。一旦你了解了皮肤的所有内部工作原理,它就是非常酷的东西。
希望这有帮助。
答案 1 :(得分:1)
它肯定在3.x和4.x之间变化。它也可能在点发布之间变得更加令人兴奋。这里有一些细节:http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7e3a.html