Google maps Flex Google Maps API和全局函数调用问题

Google maps Flex Google Maps API和全局函数调用问题,google-maps,apache-flex,global-variables,flex4,Google Maps,Apache Flex,Global Variables,Flex4,我正试图在AdobeAIR环境(Flex4)中构建一个基于窗口的应用程序系统(一个迷你GUI,如果您愿意的话)。在实现窗口拖动时,我通过从全局函数更新现在激活的窗口深度来说明z顺序,该函数每次访问时都会更新一个隐藏变量(确保所选窗口始终位于顶部)。(注意:我选择全局函数而不是一组事件,因为此操作的目标是立即接收返回值,而不是告诉系统的其他部分执行某些操作,因此我认为这是“使用事件在对象之间通信”的正常建议的有效例外。)我遇到了几十种创建和调用此全局函数的可能解决方案,但迄今为止唯一有效的解决方案

我正试图在AdobeAIR环境(Flex4)中构建一个基于窗口的应用程序系统(一个迷你GUI,如果您愿意的话)。在实现窗口拖动时,我通过从全局函数更新现在激活的窗口深度来说明z顺序,该函数每次访问时都会更新一个隐藏变量(确保所选窗口始终位于顶部)。(注意:我选择全局函数而不是一组事件,因为此操作的目标是立即接收返回值,而不是告诉系统的其他部分执行某些操作,因此我认为这是“使用事件在对象之间通信”的正常建议的有效例外。)我遇到了几十种创建和调用此全局函数的可能解决方案,但迄今为止唯一有效的解决方案是:

event.target.parentApplication.obtainNewHigherDepth()

正如您所看到的,它实际上根本不是一个全局函数调用,而是对顶级(或更顶级)父级的调用,该父级恰好包含所需的函数。在我的测试用例中,即使我将内部内容组件添加到窗口中,这也可以正常工作。但是,当添加Google地图作为窗口内容时,单击地图类型按钮会导致错误:

ReferenceError: Error #1069: Property parentApplication not found on com.google.maps.wrappers.
WrappableSprite and there is no default value.
at Window/selectWindow()[C:\Users\d04000196\Desktop\Projects\UI Concepting\ErrorExample\src\Window.mxml:18]
因此,谷歌地图API似乎试图用错误的上下文调用我的代码。作为Flex/Air的新手,我不知道如何像使用Javascript一样绑定相关上下文。但这不必要

若有更好的方法来创建和调用真正的全局函数(并使用相关的全局变量),那个么上下文不一致的问题就无关紧要了。或者,如果有一个已知的解决谷歌地图API这个特定问题的解决方案,它也可以作为一个解决方案(但不能作为未来的证明)

以下文件是说明该问题所需的最低代码

设置
  • 通过Flash Builder将以下文件加载到新Adobe Air项目的默认包中
  • 举例说明错误
  • 运行应用程序
  • 单击“打开地图”按钮
  • 单击地图区域右上角的任何地图类型按钮
  • ExampleError.mxml
    
    
    Window.mxml
    
    
    CustomMap.mxml
    
    

    更新 在刚才的另一个问题上发现(它永远不会失败,是吗?),这是:

    FlexGlobals.topLevelApplication


    似乎给了我想要的东西。如果我的窗口组件曾经在这个特定的应用程序之外使用过,那么它的缺点是不安全,但是因为这不是计划中的,所以它应该足够了。尽管如此,如果有更好的解决方案,我还是很想听听。

    嘿,我只是快速地读了一遍,也许我错了,但我想你应该看看。它负责深度排序

    嘿,我只是快速阅读了一下,也许我错了,但我想你应该看看。它负责深度排序

    我认为您应该做的是:

  • 创建名为DepthRequestEvent的自定义事件
  • 将侦听器添加到主应用程序(ExampleError.mxml):
    addEventListener(DepthRequestEvent.REQUEST\u DEPTH,获得新的更高的深度)
  • 将侦听器添加到Window.mxml:
    addEventListener(DepthRequestEvent.REQUEST\u结果,handleDepthRequestResult)
  • 从Window.mxml发送一个
    DepthRequestEvent.REQUEST\u DEPTH
  • 在主应用程序的ActainNewHigherDepth()函数中,在向事件添加
    深度
    值后,调度一个
    DepthRequestEvent.REQUEST\u结果
    事件
  • Window.mxml中的
    handleDepthRequestResult()
    函数将捕获此信息,您可以从事件参数中获取event.depthValue变量
  • 更新:在Window.mxml中,使用以下命令添加事件侦听器:
    FlexGlobals.topLevelApplication.addEventListener(…。


    答对了,松散耦合的类!(调用类的家长是一种拒绝)

    我认为您应该做的是:

  • 创建名为DepthRequestEvent的自定义事件
  • 将侦听器添加到主应用程序(ExampleError.mxml):
    addEventListener(DepthRequestEvent.REQUEST\u DEPTH,获得新的更高的深度)
  • 将侦听器添加到Window.mxml:
    addEventListener(DepthRequestEvent.REQUEST\u结果,handleDepthRequestResult)
  • 从Window.mxml发送一个
    DepthRequestEvent.REQUEST\u DEPTH
  • 在主应用程序的ActainNewHigherDepth()函数中,在向事件添加
    深度
    值后,调度一个
    DepthRequestEvent.REQUEST\u结果
    事件
  • Window.mxml中的
    handleDepthRequestResult()
    函数将捕获此信息,您可以从事件参数中获取event.depthValue变量
  • 更新:在Window.mxml中,使用以下命令添加事件侦听器:
    FlexGlobals.topLevelApplication.addEventListener(…。


    答对了,松散耦合的类!(调用类的父类是一种拒绝)

    感谢您的想法,但PopUpManager是专门为弹出窗口而构建的,存在以下问题:“PopUpManager还提供了模式,因此弹出窗口下方的窗口无法接收鼠标事件,并且如果用户在窗口外单击鼠标,也会提供一个事件,因此开发人员可以选择关闭窗口或警告用户。“我需要对整个过程有良好的控制,这意味着同时访问多个窗口和其他不寻常的东西。感谢您的想法,但PopUpManager是专门为弹出窗口而构建的,存在以下问题:“PopUpManager还提供了模式,因此弹出窗口下方的窗口无法接收鼠标事件,如果用户向外单击鼠标,也会提供一个事件
    <?xml version="1.0" encoding="utf-8"?>
    <s:WindowedApplication 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="800" height="600"
                           frameRate="60"
                           applicationComplete="init()">
        
        <fx:Script>
            <![CDATA[
                // ********************
                // THE PART IN QUESTION
                // ********************
                private var maxDepth:Number = 0;
                public function obtainNewHigherDepth():Number {
                    return (maxDepth++);
                }
                
                private function openAMap(event:MouseEvent):void {
                    var window:Window = new Window();
                    var map:CustomMap = new CustomMap();
                    
                    window.x = 160;
                    window.titleBarText.text = "Map"
                    window.content.addElement(map);
                    this.addElement(window);
                }
                
                private function init():void {
                    openMapButton.addEventListener(MouseEvent.CLICK, openAMap);
                    statusBar.visible = false;
                }
            ]]>
        </fx:Script>
        
        <s:VGroup x="10" y="10" width="135" height="580">
            <s:Button label="Open a Map" id="openMapButton" />
        </s:VGroup>
    </s:WindowedApplication>
    
    <?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"
             xmlns:visuals="com.lsus.udop.visuals.*"
             width="400" height="400" depth="1"
             initialize="init()">
        
        <fx:Script>
            <![CDATA[
                import flash.events.MouseEvent;
                
                private var moving:Boolean = false;
                private var relativeX:Number;
                private var relativeY:Number;
                
                private function selectWindow(event:MouseEvent):void {
                    // ********************
                    // THE PART IN QUESTION
                    // ********************
                    this.depth = event.target.parentApplication.obtainNewHigherDepth();
                }
                
                private function windowDragMouseDown(event:MouseEvent):void {
                    relativeX = event.stageX - this.x;
                    relativeY = event.stageY - this.y;
                    
                    moving = true;
                    
                    this.systemManager.addEventListener(MouseEvent.MOUSE_MOVE, windowDragMouseMove, true);
                    this.systemManager.addEventListener(MouseEvent.MOUSE_UP, windowDragMouseUp, true);
                }
                
                private function windowDragMouseMove(event:MouseEvent):void {
                    event.stopImmediatePropagation();
                    
                    this.x = event.stageX - relativeX;
                    this.y = event.stageY - relativeY;
                }
                
                private function windowDragMouseUp(event:MouseEvent):void {
                    event.stopImmediatePropagation();
                    
                    moving = false;
                    
                    this.systemManager.removeEventListener(MouseEvent.MOUSE_MOVE, windowDragMouseMove, true);  
                    this.systemManager.removeEventListener(MouseEvent.MOUSE_UP, windowDragMouseUp , true);
                }
                
                private function init():void {
                    this.addEventListener(MouseEvent.MOUSE_DOWN, selectWindow);
                    titleBar.addEventListener(MouseEvent.MOUSE_DOWN, windowDragMouseDown);
                    this.depth = this.parentApplication.obtainNewHigherDepth();
                }
            ]]>
        </fx:Script>
        
        <s:Rect width="100%" height="100%">
            <s:fill>
                <s:SolidColor color="0x000000" />
            </s:fill>
        </s:Rect>
        
        <s:Group id="titleBar" top="0" left="0" right="0" height="20">
            <s:Label text="Title Bar Text" id="titleBarText" top="5" bottom="0" left="5" color="0xffffff" />
        </s:Group>
        
        <s:Group id="content" top="21" left="1" right="1" bottom="1" />
        
    </s:Group>
    
    <?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="100%" height="100%"
             initialize="init()">
        
        <fx:Script>
            <![CDATA[
                import com.google.maps.Map;
                import com.google.maps.MapEvent;
                import com.google.maps.MapType;
                import com.google.maps.controls.MapTypeControl;
                
                private function onMapReady(event:MapEvent):void {
                    map.enableScrollWheelZoom();
                    map.addControl(new MapTypeControl());
                }
                
                private function init():void {
                    map.addEventListener(MapEvent.MAP_READY, onMapReady);
                }
            ]]>
        </fx:Script>
        
        <maps:Map xmlns:maps="com.google.maps.*"
                  url="http://code.google.com/apis/maps/"
                  key="ABQIAAAAiVMBdjzjhpqA-qSxuuT0cRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQ4igt7gOyr4x11lp3ETKR2fOH5Hw"
                  sensor="false"
                  width="100%" height="100%" id="map" />
    </s:Group>