Apache flex datagrid项目的弹出式编辑器-挂起浏览器
我有一个非常简单的东西:一个呈现一些项目的datagrid。单击一个项目会弹出一个编辑器(因为该项目有很多属性,可能无法在datagrid中正确编辑) 弹出窗口只包含一个表单和一个[Bindable]引用,该引用指向它所编辑的项(从datagrid的itemClick处理程序传递)。表单的默认值是通过使用{}概念绑定到相应的项属性来获取的,而表单值是使用mx:binding标记绑定回该项的 现在问题来了。当弹出窗口第一次出现时,一切正常。但是,当关闭后,通过单击同一项再次弹出窗口时,浏览器将挂起(afaik,因为无休止地触发更改观察程序,导致堆栈溢出或类似情况) 我们在Safari、IE和Chrome中有相同的行为,所以我猜这与浏览器相关的东西无关。从弹出窗口中的项目引用中删除[Bindable]或从编辑器中删除mx:Binding标记都会抑制该问题,但当然,编辑不再起作用 我的头已经撞到墙上好几天了,但还是不能让它工作。这是否给某人敲响了警钟,这里可能出了什么问题(有什么比这更容易) 以下是弹出窗口的代码:Apache flex datagrid项目的弹出式编辑器-挂起浏览器,apache-flex,popup,Apache Flex,Popup,我有一个非常简单的东西:一个呈现一些项目的datagrid。单击一个项目会弹出一个编辑器(因为该项目有很多属性,可能无法在datagrid中正确编辑) 弹出窗口只包含一个表单和一个[Bindable]引用,该引用指向它所编辑的项(从datagrid的itemClick处理程序传递)。表单的默认值是通过使用{}概念绑定到相应的项属性来获取的,而表单值是使用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;