【问题标题】:Flex: parentDocument inconsistent between SDK version 4.1 and 4.5Flex: parentDocument 在 SDK 4.1 和 4.5 版本之间不一致
【发布时间】:2012-10-30 05:49:41
【问题描述】:

我发现 Flex SDK 4.1 和 4.5 之间的 parentDocument 存在一些不一致之处。简而言之,在 4.1 中工作的现有代码在 4.5(和 4.6)中被破坏了。这是一个小例子来演示:

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>

子组件.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,我可以通过parentDocument 成功检索Application 对象。但是,这在 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 中的子组件调用方法(通过parentDocument)。因此,涉及查找Application 对象的其他方法的解决方法并不真正适用,因为子组件实际上是在寻找TitleWindow,而不是Application

【问题讨论】:

    标签: apache-flex flex4 flex-spark


    【解决方案1】:

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

    希望这会有所帮助。

    【讨论】:

    • 感谢您的链接。那里肯定有一些很好的信息。您将火花组件的子代实际上添加到皮肤的 contentGroup 的观点是有道理的。但我仍然很困惑为什么parentDocument 的行为会在 4.1 和 4.5 之间发生变化。如果这是一个火花,那么 3.x 和 4.x 不同是有道理的,但我希望 4.0 - 4.7 是一致的。
    • 那不是 100% 确定的。可能......在更改文档中,我注意到诸如“改进火花框架”之类的 cmets。我猜想 .parentDocument 用于指向组件的事实是作为遗留支持的一种方便方法(如您的情况)。作为某种“改进”,他们让它与框架更加一致。
    【解决方案2】:

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

    【讨论】:

    • 嗯,“令人兴奋”与我想到的词有点不同 :-)。我看过你链接的文档,虽然有点含糊,但听起来4.1 SDK是正确的,后面的版本不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2020-07-20
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多