2010-09-09 70 views
0

我有一個非常簡單的事情:呈現一些項目的數據網格。點擊一個項目會彈出一個彈出編輯器(因爲該項目有很多屬性,可能不會在數據網格中編輯)。datagrid項目彈出編輯器 - 掛起瀏覽器

彈出窗口只包含一個表單和[Bindable]引用它所編輯的項目(它是從datagrid的itemClick處理程序傳遞的)。通過使用{}概念綁定到相應的項目屬性來獲取表單的默認值,而使用mx:Binding標籤將表單值綁定回該項目。

和現在的問題。當彈出窗口第一次出現時,一切都很好。然而,當關閉彈出窗口後,通過點擊相同的項目再次出現,瀏覽器掛起(afaik因爲更改觀察者無休止地被觸發,導致stackoverflow或類似的東西)。

我們在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; 
     } 
+0

一些示例代碼會有幫助,特別是負責設置綁定的示例代碼。 – 2010-09-10 08:40:17

+0

添加了調用代碼和彈出代碼 – 2010-09-10 13:41:41

回答

0

感謝張貼的代碼。現在我可能會有所幫助。

你在哪裏處理彈出窗口的關閉事件? Besure使用這樣的事情:

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 以更好地理解模塊。

+0

好吧,我認爲這可能與彈出窗口回收的內存問題有關 – 2010-09-10 13:32:28

+0

添加了調用代碼和彈出代碼 – 2010-09-10 13:42:58

+0

我在TitleWindow的定義中管理關閉:close =「PopUpManager。 removePopUp(本);」。 在我們的應用程序中沒有模塊(只有一個應用程序帶有組件,狀態等),所以我認爲它與Flex「類加載」沒有任何關係,似乎更像是一個內存問題(就像你之前建議),因爲重新使用彈出窗口似乎解決了我的問題。 – 2010-09-10 18:24:24

0

如前所述,重複使用彈出窗口而不是每次創建新窗口都似乎解決了問題。