Apache flex datagrid项目的弹出式编辑器-挂起浏览器

Apache flex datagrid项目的弹出式编辑器-挂起浏览器,apache-flex,popup,Apache Flex,Popup,我有一个非常简单的东西:一个呈现一些项目的datagrid。单击一个项目会弹出一个编辑器(因为该项目有很多属性,可能无法在datagrid中正确编辑) 弹出窗口只包含一个表单和一个[Bindable]引用,该引用指向它所编辑的项(从datagrid的itemClick处理程序传递)。表单的默认值是通过使用{}概念绑定到相应的项属性来获取的,而表单值是使用mx:binding标记绑定回该项的 现在问题来了。当弹出窗口第一次出现时,一切正常。但是,当关闭后,通过单击同一项再次弹出窗口时,浏览器将挂起

我有一个非常简单的东西:一个呈现一些项目的datagrid。单击一个项目会弹出一个编辑器(因为该项目有很多属性,可能无法在datagrid中正确编辑)

弹出窗口只包含一个表单和一个[Bindable]引用,该引用指向它所编辑的项(从datagrid的itemClick处理程序传递)。表单的默认值是通过使用{}概念绑定到相应的项属性来获取的,而表单值是使用mx:binding标记绑定回该项的

现在问题来了。当弹出窗口第一次出现时,一切正常。但是,当关闭后,通过单击同一项再次弹出窗口时,浏览器将挂起(afaik,因为无休止地触发更改观察程序,导致堆栈溢出或类似情况)

我们在Safari、IE和Chrome中有相同的行为,所以我猜这与浏览器相关的东西无关。从弹出窗口中的项目引用中删除[Bindable]或从编辑器中删除mx:Binding标记都会抑制该问题,但当然,编辑不再起作用

我的头已经撞到墙上好几天了,但还是不能让它工作。这是否给某人敲响了警钟,这里可能出了什么问题(有什么比这更容易)

以下是弹出窗口的代码:

<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" title="Details"
showCloseButton="true" close="PopUpManager.removePopUp(this);" creationComplete="PopUpManager.centerPopUp(this)">
<mx:Script>
    <![CDATA[
        import mx.managers.PopUpManager;
        import my.Detail;

        [Bindable] private var _documentDetail:Detail;

        public function set documentDetail(value:Detail):void {
            this._documentDetail = value;
        }

        public function set readOnly(value:Boolean):void {
            if (value) {
                this.currentState = "read-only";
            }
        }
    ]]>
</mx:Script>
<mx:states>
    <mx:State name="read-only">
        <mx:SetProperty target="{startDate}" name="enabled" value="false"/>
        <mx:SetProperty target="{comments}" name="enabled" value="false"/>
    </mx:State>
</mx:states>
<!--
<mx:Binding source="this.startDate.selectedDate" destination="_documentDetail.startDate"/>
<mx:Binding source="this.comments.text" destination="_documentDetail.comment"/>
-->
<mx:VBox width="100%" height="100%">
    <mx:FormItem label="{resourceManager.getString('eRequestAppli','startdate')}:" labelWidth="160" width="100%">
        <mx:DateField id="startDate" width="100%" selectedDate="{_documentDetail.startDate}" formatString="{resourceManager.getString('eRequestAppli', 'dateformat')}" editable="false"/>
    </mx:FormItem>
    <mx:FormItem label="{resourceManager.getString('eRequestAppli','comments')}:" labelWidth="160" width="100%" height="79">
        <mx:TextArea id="comments" width="100%" height="100%" text="{_documentDetail.comment}" editable="false"/>
    </mx:FormItem>
</mx:VBox>
</mx:TitleWindow>

谢谢你发布代码。现在我也许能帮上忙

您在哪里处理弹出窗口的关闭事件?请务必使用以下内容:

private function handleCloseEvent():void {
                PopUpManager.removePopUp(this);
            } 
此外,您的问题似乎与以下方面有关:

因为模块加载到子域中,所以它拥有不在主应用程序域中的类定义。例如,加载PopUpManager类的第一个模块成为整个应用程序的PopUpManager类的所有者,因为它向SingletonManager注册管理器。如果其他模块稍后尝试使用PopUpManager,Adobe®Flash®Player将引发异常

解决方案是确保管理器(如PopUpManager和任何其他共享服务)由主应用程序定义(或稍后加载到shell的应用程序域)。当您将其中一个类升级到shell时,所有模块都可以使用该类。通常,这是通过向脚本块添加以下内容来完成的:

import mx.managers.PopUpManager;
private var popUpManager:PopUpManager;
首先使用组件的模块在其域中拥有该组件的类定义。因此,如果另一个模块尝试使用已被另一个模块使用的组件,则其定义将与现有定义不匹配。要避免组件定义不匹配,请在主应用程序中创建组件的实例。结果是组件的定义归主应用程序所有,并且可以由任何子域中的模块使用

见:
为了更好地理解模块。

如前所述,重用弹出窗口而不是每次创建新的弹出窗口似乎解决了问题。

一些示例代码会有所帮助,特别是负责设置绑定的代码。添加了调用代码和弹出代码我在TitleWindow:close的定义中管理关闭=“PopUpManager.removePopUp(此);“.我们的应用程序中没有模块(只有一个应用程序包含大量的组件、状态等),因此我认为这与Flex“类加载”无关,似乎更像是一个内存问题(如您之前所建议的),因为重用弹出窗口似乎解决了我遇到的问题。
import mx.managers.PopUpManager;
private var popUpManager:PopUpManager;