我发现parentDocument
Flex SDK 4.1 和 4.5 之间存在一些不一致之处。简而言之,在 4.1 中工作的现有代码在 4.5(和 4.6)中被破坏了。这是一个小例子来演示:
测试项目.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>
子组件.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 的方式做事。所以,我的问题是:
- 有没有其他人遇到过这个问题?如果是这样,你是如何处理的?
- 如果您开发了一种解决方法,您的解决方案是依赖于特定的 SDK 版本,还是适用于所有 SDK 版本?
- 从 4.1 到 4.5 的行为变化是有意的,还是这是一个错误?我怀疑是错误,但我一直无法以一种或另一种方式找到任何确定的东西。
请注意,我上面的示例旨在以最少的代码和最小的复杂性来演示该问题。在我的实际项目中,我有一个包含TitleWindow
子组件的模块,并且我试图让子组件调用TitleWindow
(via parentDocument
)中的方法。因此,涉及查找Application
对象的其他方法的解决方法并不真正适用,因为子组件实际上是在寻找一个TitleWindow
,而不是Application
.