Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.09.2009, 21:10
incorp вне форума Посмотреть профиль Отправить личное сообщение для incorp Найти все сообщения от incorp
  № 1  
Ответить с цитированием
incorp

Регистрация: Nov 2008
Адрес: Москва
Сообщений: 92
По умолчанию Передать свой параметр в функцию обработчик

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

Старый 09.09.2009, 12:34
incorp вне форума Посмотреть профиль Отправить личное сообщение для incorp Найти все сообщения от incorp
  № 3  
Ответить с цитированием
incorp

Регистрация: Nov 2008
Адрес: Москва
Сообщений: 92
благодарствую, не дочитал

Старый 09.09.2009, 12:47
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 4  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
для приёма сообщений изменения модели в 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;
		}
 
 
	}
 
}
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 09.09.2009 в 12:49.
Старый 09.09.2009, 13:19
incorp вне форума Посмотреть профиль Отправить личное сообщение для incorp Найти все сообщения от incorp
  № 5  
Ответить с цитированием
incorp

Регистрация: Nov 2008
Адрес: Москва
Сообщений: 92
большое спасибо моему бывшему коллеге буду вникать.

Старый 09.09.2009, 16:02
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Котяра, лень было отдельные типы событий завести, да?

Старый 09.09.2009, 20:37
Felicast вне форума Посмотреть профиль Отправить личное сообщение для Felicast Найти все сообщения от Felicast
  № 7  
Ответить с цитированием
Felicast
 
Аватар для Felicast

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
Цитата:
public var field:*=null;
я дак предпочитаю для каждой ситуации свой евент, а не один на все случаи жизни
__________________
я могу стать всем, если только захочу

Старый 09.09.2009, 22:19
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от Felicast Посмотреть сообщение
я дак предпочитаю для каждой ситуации свой евент, а не один на все случаи жизни
Необязательно новый event, можно и просто разного типа сделать. Но уж точно даже разные события лучше вот такого вот «универсального».

Старый 10.09.2009, 14:48
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 9  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
не вижу ничего плохого в "универсальности", как раз лень создавать новые события для каждого изменения полей модели и уменьшение строчек кода и сподвигло меня на этот код. код используется только в связке M->V/
гораздо удобнее написать
Код AS3:
update("y");
и
Код AS3:
addChangeModelFieldListener("y", yChanged);
и не заморачиваться отпиской.
__________________
Отряд Котовскага

Старый 10.09.2009, 14:51
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от Котяра Посмотреть сообщение
лень создавать новые события
В этом и проблема.

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:49.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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