Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Cairngorm] проблема с cairngorm (http://www.flasher.ru/forum/showthread.php?t=152166)

chata 12.03.2011 18:00

проблема с cairngorm
 
Здраствуйте, помогите пожалуйста понять причину. Используется cairngorm2, так вот в одном из случает добавления почему то в Commands дергается несколько раз, а иногла и один execute, хотя вроде как только один dispatchEvent передаем.

Привожу примеры:
View
Код AS1/AS2:

private function saveObject():void{
                                if (this.edit)
                                {
                                        targetValueOb.data = inputName.text;
                                        targetValueEvent=new TargetValueEvent(TargetValueControl.EDIT_TARGET_VALUE, targetValueOb, ownerTarget);
                                }
                                else
                                {
                                        targetValueOb.data = inputName.text;
                                        targetValueOb.targetId = ownerTarget.id;
                                        targetValueEvent=new TargetValueEvent(TargetValueControl.ADD_TARGET_VALUE, targetValueOb, ownerTarget);
                                }
 
                                CairngormEventDispatcher.getInstance().dispatchEvent(targetValueEvent);
                                close();
                        }

Command
Код AS1/AS2:

public class TargetValueCommand  extends SequenceCommand  implements Command, Responder
 
....
 
override public function execute(event:CairngormEvent):void
                {
                        var delegate : TargetValueDelegate = new TargetValueDelegate(this);
 
                        try
                        {
                                targetValueEvent = TargetValueEvent(event);
                                //nextEvent = targetValueEvent.nextChainedEvent;
                        }
                        catch(err:Error)
                        {
                                targetValueEvent=null;
                        }
 
                        if(targetValueEvent!=null)
                        {
                                myRequest = event.type;
                                switch(event.type)
                                {
                                        case TargetValueControl.LOAD_TARGET_VALUE:
                                                delegate.loadTargetValue();
                                                break;
                                        case TargetValueControl.ADD_TARGET_VALUE:
                                                delegate.addTargetValue(targetValueEvent.targetValueOb);
                                                break;
                                        case TargetValueControl.EDIT_TARGET_VALUE:
                                                delegate.editTargetValue(targetValueEvent.targetValueOb);
                                                break;
                                        case TargetValueControl.REMOVE_TARGET_VALUE:
                                                delegate.removeTargetValue(targetValueEvent.targetValueOb)
                                }
                        }
                }

Спасибо.

Добавлено через 44 минуты
может это имеет значение, view в котором можем делать сохранение вызывается из таблицы при двойном клике на поле, так вот замечено что когда первый раз вызываем его то добавляет 1 элемент, когда второй то 2 элемента, когда третий - 3 и тд

Привожу пример создания view:
Код AS1/AS2:

private function targetValueCED(e:Event):void{
                                var popUp:TargetValueView = TargetValueView(PopUpManager.createPopUp(this,TargetValueView,true));
                                popUp.targetOb = targetDataGrid.selectedItem as TargetVO;
                                popUp.x=this.width/2 - popUp.width/2 + 40;
                                popUp.y=this.height/2 - popUp.height/2;
                        }


wvxvw 14.03.2011 10:43

Посмотрите, не вызывается ли функция (выше по стеку) из каких-нибудь биндинг-выражений. Биндинги имеют два неприятных свойства - игнорировать ошибки и повторно вызывать функцию, если она завершилась с ошибкой в прошлый раз.

А вообще, за такой код надо из зарплаты вычитать :)
Код AS3:

override public function execute(event:CairngormEvent):void
                {
                        var delegate : TargetValueDelegate = new TargetValueDelegate(this);
 targetValueEvent = event as TargetValueEvent;
                        //try
                        //{
                                //targetValueEvent = TargetValueEvent(event);
                                //nextEvent = targetValueEvent.nextChainedEvent;
                        //}
                        //catch(err:Error)
                        //{
                                //targetValueEvent=null;
                        //}
 if (targetValueEvent)
                        //if(targetValueEvent!=null)
                        {
// Порочная логика, никогда так не делайте, подпишите по слушателю на событие,
// либо используйте state, либо strategy. Старайтесь избегать switch, тем более,
// что тут он совершенно ни к чему и только усложняет тестирование.
                                myRequest = event.type;
                                switch(event.type)
                                {
                                        case TargetValueControl.LOAD_TARGET_VALUE:
                                                delegate.loadTargetValue();
                                                break;
                                        case TargetValueControl.ADD_TARGET_VALUE:
                                                delegate.addTargetValue(targetValueEvent.targetValueOb);
                                                break;
                                        case TargetValueControl.EDIT_TARGET_VALUE:
                                                delegate.editTargetValue(targetValueEvent.targetValueOb);
                                                break;
                                        case TargetValueControl.REMOVE_TARGET_VALUE:
                                                delegate.removeTargetValue(targetValueEvent.targetValueOb)
                                }
                        }
                }



Часовой пояс GMT +4, время: 03:53.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.