数据网格项的弹出编辑器 - 挂起浏览器

时间:2010-09-09 19:48:57

标签: flex popup

我有一个非常简单的事情:一个渲染一些项目的数据网格。单击某个项目会弹出一个弹出编辑器(因为该项目有很多属性,可能无法在数据网格中直接编辑)。

弹出窗口只包含一个表单和一个[Bindable]引用它所编辑的项目(从datagrid的itemClick处理程序传递)。 form的默认值是通过使用{} notion绑定到相应的item属性获取的,而form值使用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 show(detail:Detail, readOnly:Boolean=false):void {
            var popup:fxc_ProposalDetail =
                fxc_ProposalDetail(PopUpManager.createPopUp(UIComponent(Application.application), fxc_ProposalDetail, true));
            popup.documentDetail = detail;
            popup.readOnly = readOnly;
        }

2 个答案:

答案 0 :(得分:0)

感谢发布代码。现在我可以帮忙。

你在哪里处理弹出窗口的关闭事件?好好用这样的东西:

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;

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

见:http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-799a.html 为了更好地理解模块。

答案 1 :(得分:0)

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