всплывающий редактор для элементов данных - зависает браузер - PullRequest
0 голосов
/ 09 сентября 2010

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

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

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

у нас такое же поведение в 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 голосов
/ 10 сентября 2010

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

0 голосов
/ 10 сентября 2010

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

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

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 для лучшего понимания модулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...