Flex:SDK版本4.1和4.5之间的parentDocument不一致

时间:2012-10-30 05:49:41

标签: flex flex4 flex-spark

我发现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的方式做事。所以,我的问题是:

  1. 还有其他人遇到过这个问题吗?如果是这样,你是如何处理的 它?
  2. 如果您已经开发出一种解决方法,那么您的解决方案是否依赖于此 特定的SDK版本,还是适用于所有SDK版本?
  3. 行为从4.1变为4.5是故意的,或者是 这个bug?我怀疑是bug,但我一直找不到任何东西 确切的一种方式。
  4. 请注意,我上面的示例旨在用最少的代码和最小的复杂性来演示问题。在我的实际项目中,我有一个包含带有子组件的TitleWindow的模块,我正在尝试让子组件调用TitleWindow中的方法(通过parentDocument)。因此,涉及查找Application对象的其他方法的变通方法并不真正适用,因为子组件实际上正在寻找TitleWindow,而不是Application

2 个答案:

答案 0 :(得分:2)

是的,这不是一个错误。这实际上是火花组件的“特征”。基本上,对于SkinnableContainers(TitleWindow是),子节点实际上被添加到组件外观的contentGroup中。有一些好文章解释了所有at this linkalso this one。在许多场景中,您可以快速将代码更改为.owner属性(只要子对象是DisplayObject),以实现所需的结果。更好的方法可能是重构一些代码以更好地适应皮肤提供的视图封装(让子组件触发事件而不是尝试访问父级的方法......那种事情)。一旦你了解了皮肤的所有内部工作原理,它就是非常酷的东西。

希望这有帮助。

答案 1 :(得分:1)

它肯定在3.x和4.x之间变化。它也可能在点发布之间变得更加令人兴奋。这里有一些细节:http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7e3a.html