1

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

  1. 有没有其他人遇到过这个问题?如果是这样,你是如何处理的?
  2. 如果您开发了一种解决方法,您的解决方案是依赖于特定的 SDK 版本,还是适用于所有 SDK 版本?
  3. 从 4.1 到 4.5 的行为变化是有意的,还是这是一个错误?我怀疑是错误,但我一直无法以一种或另一种方式找到任何确定的东西。

请注意,我上面的示例旨在以最少的代码和最小的复杂性来演示该问题。在我的实际项目中,我有一个包含TitleWindow子组件的模块,并且我试图让子组件调用TitleWindow(via parentDocument)中的方法。因此,涉及查找Application对象的其他方法的解决方法并不真正适用,因为子组件实际上是在寻找一个TitleWindow,而不是Application.

4

2 回答 2

2

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

希望这可以帮助。

于 2012-10-31T07:17:16.610 回答
1

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

于 2012-10-30T14:51:50.580 回答