![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Nov 2008
Адрес: Москва
Сообщений: 92
|
Можно ли(и каким образом) передать свой параметр в ивентовую функцию обработчик если я ее вызываю явно в коде.(использую для этого дефолтное значение ивента). Я имею в виду без использования общих переменных класса.
|
|
|||||
|
Регистрация: Nov 2008
Адрес: Москва
Сообщений: 92
|
благодарствую, не дочитал
![]() |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
для приёма сообщений изменения модели в MVC я использую следующий код:
Событие: 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"); } } } 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); } } } 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"); } } } 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 } ); } } } 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; } } }
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 09.09.2009 в 12:49. |
|
|||||
|
Регистрация: Nov 2008
Адрес: Москва
Сообщений: 92
|
большое спасибо моему бывшему коллеге
буду вникать. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Котяра, лень было отдельные типы событий завести, да?
![]() |
|
|||||
|
Цитата:
__________________
я могу стать всем, если только захочу |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Необязательно новый event, можно и просто разного типа сделать. Но уж точно даже разные события лучше вот такого вот «универсального».
|
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
не вижу ничего плохого в "универсальности", как раз лень создавать новые события для каждого изменения полей модели и уменьшение строчек кода и сподвигло меня на этот код. код используется только в связке M->V/
гораздо удобнее написать и и не заморачиваться отпиской.
__________________
Отряд Котовскага |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
|
![]() |
![]() |
Часовой пояс GMT +4, время: 01:49. |
|
|
« Предыдущая тема | Следующая тема » |
|
|