Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передать свой параметр в функцию обработчик (http://www.flasher.ru/forum/showthread.php?t=129726)

incorp 08.09.2009 21:10

Передать свой параметр в функцию обработчик
 
Можно ли(и каким образом) передать свой параметр в ивентовую функцию обработчик если я ее вызываю явно в коде.(использую для этого дефолтное значение ивента). Я имею в виду без использования общих переменных класса.

MrPoma 08.09.2009 21:29

http://www.flasher.ru/forum/showthread.php?t=80015

incorp 09.09.2009 12:34

благодарствую, не дочитал:)

Котяра 09.09.2009 12:47

для приёма сообщений изменения модели в MVC я использую следующий код:
Событие:
Код AS3:

package ru.globo.gui.core.mvc.models 
{
        import flash.events.Event;
 
        /**
        * ...
        * @author k0t0vich
        */

        public class ChangeModelEvent extends Event
        {
                public static const CHANGE:String = "change";
                public var field:*=null;
                public function ChangeModelEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
                {
                        super(type, bubbles, cancelable);
                }
 
                public override function clone():Event
                {
                        var event:ChangeModelEvent = new ChangeModelEvent(type, bubbles, cancelable);
                        event.field = field;
                        return event;
                }
 
                public override function toString():String
                {
                        return formatToString("ChangeModelEvent", "type", "field", "bubbles", "cancelable", "eventPhase");
                }
 
        }
 
}

Базовая модель:
Код AS3:

package ru.globo.gui.core.mvc.models 
{
        import flash.events.EventDispatcher;
 
        /**
        * Базовый класс модели
        * @author k0t0vich (c) 2009 b_konstantin@list.ru
        */

        public class BaseModel extends EventDispatcher implements IModel
        {
 
                public function BaseModel()
                {       
                }
 
                /**
                *  Диспатчим событие об изменении структуры
                * @param        field
                */

                public function update(field:String=""):void
                {
                        var event: ChangeModelEvent= new ChangeModelEvent(ChangeModelEvent.CHANGE+field);
                        // Проверка на доступность свойства
                        if (field!="")
                        try
                        {
                        event.field = this[field];
                        }
                        catch (e:Error)
                        {
                                trace (e);
                        }
                        dispatchEvent(event);
                }
 
 
        }
 
}

тестовая модель:
Код AS3:

package ru.globo.gui.models 
{
        import ru.globo.gui.core.mvc.models.BaseModel;
 
        /**
        * ...
        * @author k0t0vich
        */

        public class TestModel extends BaseModel
        {
                private var _y:int=0;       
                public function TestModel()
                {
 
                }
 
                public function get y():int { return _y; }
 
                public function set y(value:int):void
                {
                        _y = value;
                        update("y");
                }
 
        }
 
}

базовая вьюшка
Код AS3:

package ru.globo.gui.core.mvc.views 
{
 
        import flash.display.Sprite;
        import flash.events.Event;
        import ru.globo.gui.core.mvc.models.ChangeModelEvent;
        import ru.globo.gui.core.mvc.models.IModel;
 
        /**
        * Базовый класс представлений
        * @author k0t0vich (c) 2009 b_konstantin@list.ru
        */

        public class BaseSpriteView extends Sprite implements IView
        {
 
                private var _modelFieldEventListenersArray:Array =[];
 
                public function BaseSpriteView()
                {
                        super();
                }
 
                private var _model:IModel=null;
 
                /**
                * Установка модели
                */

                public function set model(__model:IModel):void
                {
 
                        if (_model != null) removeModel();
                        _model = __model;
                        _model.addEventListener(ChangeModelEvent.CHANGE, update);
                }
 
                /**
                * Переопределяемая ф-ция
                */

                private function removeModel():void
                {
                        _model.removeEventListener(ChangeModelEvent.CHANGE, update);
 
                        var len:int  =  _modelFieldEventListenersArray.length;
                        for (var i:int = 0; i < len; i++)
                        {
                                var eventType:String = _modelFieldEventListenersArray[i].event;
                                var eventListener:Function = _modelFieldEventListenersArray[i].listener;
                                _model.removeEventListener(eventType, eventListener);
                        }
                        _modelFieldEventListenersArray = [];
 
                }
 
                /**
                * Хэндлер обновления модели. Перекрываемый метод
                * Кроме него есть дополнительные хэндлеры изменения конкретной части модели
                * @param        e
                */

                private function update(e:ChangeModelEvent):void
                {
                        trace (e);
                }
 
 
                public function get model():IModel
                {
                        return _model;
                }
 
                public function addChangeModelFieldListener(field:String,listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
                {
                        _model.addEventListener(ChangeModelEvent.CHANGE + field, listener, useCapture, priority, useWeakReference);
                        _modelFieldEventListenersArray.push( { event:ChangeModelEvent.CHANGE + field, listener:listener } );
                }
 
        }
 
}

тестовая вьюшка:
Код AS3:

package ru.globo.gui.views.test1 
{
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.text.TextField;
        import ru.globo.gui.common.events.TestViewEvent;
        import ru.globo.gui.core.mvc.models.ChangeModelEvent;
        import ru.globo.gui.core.mvc.views.BaseSpriteView;
 
        /**
        * Тестовая вьюшка - можно сделать отдельной swf или swc
        * @author k0t0vich
        */

        public class TestView2 extends BaseSpriteView
        {
 
                public var tf:TextField;
                public function TestView2()
                {
                        tf = new TextField();
                        tf.text = "start";
                        addChild(tf);
 
                }
 
                public function init():void
                {
                        addChangeModelFieldListener("y", yChanged);
                }
 
                private function yChanged(e:ChangeModelEvent):void
                {
                        tf.text ="Model.y = "+ e.field;
                }
 
 
        }
 
}


incorp 09.09.2009 13:19

большое спасибо моему бывшему коллеге :) буду вникать.

etc 09.09.2009 16:02

Котяра, лень было отдельные типы событий завести, да? :)

Felicast 09.09.2009 20:37

Цитата:

public var field:*=null;
я дак предпочитаю для каждой ситуации свой евент, а не один на все случаи жизни

etc 09.09.2009 22:19

Цитата:

Сообщение от Felicast (Сообщение 849556)
я дак предпочитаю для каждой ситуации свой евент, а не один на все случаи жизни

Необязательно новый event, можно и просто разного типа сделать. Но уж точно даже разные события лучше вот такого вот «универсального».

Котяра 10.09.2009 14:48

не вижу ничего плохого в "универсальности", как раз лень создавать новые события для каждого изменения полей модели и уменьшение строчек кода и сподвигло меня на этот код. код используется только в связке M->V/
гораздо удобнее написать
Код AS3:

update("y");

и
Код AS3:

addChangeModelFieldListener("y", yChanged);

и не заморачиваться отпиской.

etc 10.09.2009 14:51

Цитата:

Сообщение от Котяра (Сообщение 849785)
лень создавать новые события

В этом и проблема.


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

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