2010-09-09 3 views
0

У меня есть довольно простая вещь: datagrid, который отображает некоторые элементы. нажатие на элемент приведет к всплывающему редактору (поскольку элемент имеет много свойств и не может быть отредактирован прямо в datagrid).всплывающий редактор для элементов datagrid - зависает браузер

всплывающее окно содержит только форму и ссылку [Связывание] к редактируемому элементу (который передается из обработчика itemClick файла datagrid). Значения по умолчанию формы берутся путем привязки к соответствующим свойствам элемента с помощью {} понятия, тогда как значения формы привязаны к элементу с использованием тегов mx: Binding.

и теперь проблема. когда всплывающее окно воспитывается в первый раз, все в порядке. однако, когда после закрытия всплывающее окно снова появляется, нажимая на один и тот же элемент, браузер зависает (afaik из-за того, что наблюдатели за изменениями бесконечно увольняются, что приводит к переходу stackoverflow или что-то подобное).

У нас такое же поведение в Safari, IE и Chrome, поэтому я думаю, что это не связано с чем-то связанным с браузером. удаляя либо [Bindable] из ссылки на элемент во всплывающем меню, либо mx: теги привязки от редакторов подавляют проблему, но, конечно, редактирование больше не работает.

Я уже несколько дней стучу головой о стену, но все равно не могу заставить ее работать. звонит ли он кому-нибудь, что здесь может быть неправильно (что может быть проще, чем это)?

вот код всплывающего окна:

<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

Некоторые примеры кода помогут, особенно тот, кто отвечает за настройку привязок. –

+0

добавлен код вызова и всплывающий код –

ответ

0

Спасибо за размещение кода. Теперь я мог бы помочь.

Где вы работаете с событием закрытия всплывающего окна? Besure использовать что-то вроде этого:

private function handleCloseEvent():void { 
       PopUpManager.removePopUp(this); 
      } 

Кроме того, что кажется, ваша проблема связана со следующими:

Поскольку модуль загружается в дочернем домене, он владеет определений классов, которые не в основной области приложения. Например, первый модуль для загрузки класса PopUpManager становится владельцем класса PopUpManager для всего приложения, поскольку он регистрирует менеджера с помощью SingletonManager. Если другой модуль пытается использовать PopUpManager, Adobe® Flash® Player выдает исключение.

Решение заключается в обеспечении того, чтобы основные администраторы, такие как PopUpManager и любые другие общие службы, определялись основным приложением (или загружались до конца в область приложения оболочки). Когда вы продвигаете один из этих классов в оболочку, класс может затем использоваться всеми модулями. Как правило, это делается путем добавления следующего в блок скрипта:

import mx.managers.PopUpManager; 
private var popUpManager:PopUpManager; 

модуль, который использует первый компонент имеет определение класса этого компонента в своей области. В результате, если другой модуль пытается использовать компонент, который уже был использован другим модулем, его определение не будет соответствовать существующему определению. Чтобы избежать несоответствия определений компонентов, создайте экземпляр компонента в главном приложении. В результате определение компонента принадлежит основному приложению и может использоваться модулями в любом дочернем домене.

http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-799a.html для лучшего понимания модулей.

+0

. Ну, я думал, что это может быть связано с проблемами памяти с всплывающей утилитой ... –

+0

добавил код вызова и всплывающий код –

+0

Я управляю закрытием в определении TitleWindow: close = "PopUpManager. removePopUp (это);». В нашем приложении нет модулей (только одно приложение с зонами компонентов, состояний и т. Д.), Поэтому я не думаю, что это имеет какое-либо отношение к Flex «classloading», похоже, проблема с памятью (например, вы предположил раньше), поскольку повторное использование всплывающего окна, похоже, решило проблему, которую я имел. –

0

Как было предложено ранее, повторное использование всплывающего окна вместо создания нового каждый раз, кажется, решило проблему.

Смежные вопросы