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

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

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

Регистрация: Apr 2014
Сообщений: 97
По умолчанию Ошибка с конвертацией Евентов

Вылазит ошибка [Fault] exception, information=TypeError: Error #1034: Type Coercion failed: cannot convert flash.events::Event@8e41061 to net.freedomstate.events.SendArrayEvent.

Хотя в функциях у меня тип события, что принимается, соответствует типу, что отправляется. Может я не учел какого-то нюанса работы событий? Посмотрите пожалуйста.

Код AS1/AS2:
package net.freedomstate.pages.registration
{
	/**
	 * ...
	 * @author Scorpion
	 */
 
	import fl.controls.ComboBox;
	import flash.events.*;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import net.freedomstate.elements.Butt;
	import flash.display.Sprite;
	import net.freedomstate.elements.TextF;
	import net.freedomstate.events.SendArrayEvent;
 
	public class View extends Sprite 
	{
		private var _controller: Controller;
		private var _model: Model;
 
		private var _labelLogin: TextF;
		private var _labelPass: TextF;
		private var _labelInfo: TextF
		private var _inputLogin: TextF;
		private var _inputPass: TextF;
 
		private var _choiseCity: ComboBox;
 
		private var _butRegistr: Butt;
 
		public function View(): void
		{
			_model = new Model();
			_controller = new Controller(_model);
 
			_model.addEventListener(Event.ADDED, addCitiesList); 
			_model.addEventListener(Event.CHANGE, endRegistration)
 
			viewElements();
		}
 
		private function viewElements(): void
		{
			_labelLogin = new TextF(250, 350, "Логін");
			_labelPass = new TextF(250, 450, "Пароль");
			_labelInfo = new TextF(350, 275, _model.textInfo)
			_inputLogin = new TextF(450, 350, "", TextF.INPUT);
			_inputPass = new TextF(450, 450, "", TextF.INPUT);
			_inputPass.displayAsPassword = true;
 
			_choiseCity = new ComboBox();
			_choiseCity.width = 150;
			_choiseCity.height = 25;
			_choiseCity.x = 450;
			_choiseCity.y = 525;
 
			_butRegistr = new Butt(450, 600, "Зареєструватися");
			_butRegistr.addEventListener(MouseEvent.CLICK, butRegistrClick);
 
			addChild(_labelLogin);
			addChild(_labelPass);
			addChild(_labelInfo);
			addChild(_inputLogin);
			addChild(_inputPass);
			addChild(_choiseCity);
			addChild(_butRegistr);
		}
 
		private function butRegistrClick(e: Event): void
		{
			_controller.dispatchEvent(new SendArrayEvent(Event.ACTIVATE, new Array(_inputLogin.text, _inputPass.text, _choiseCity.selectedItem.label )));
		}
 
		private function addCitiesList(e: SendArrayEvent): void
		{
			for (var i: int = 0; i < _model.citiesArray.length; i++ )
			{
				_choiseCity.addItem( { label: _model.citiesArray[i] } );
			}
		}
 
		private function endRegistration(e: Event): void
		{
			_labelInfo.textColor = 0x00FF00;
			_labelInfo.text = _model.textInfo;
		}
	}
}
Код AS1/AS2:
package net.freedomstate.pages.registration
{
	/**
	 * ...
	 * @author Scorpion
	 */
 
	import flash.events.*; 
	import flash.net.*;
	import net.freedomstate.events.SendArrayEvent;
 
	public class Controller extends EventDispatcher 
	{
		private var _model: Model;
 
		public function Controller(rModel: Model): void
		{
			_model = rModel;
 
			this.addEventListener(Event.ACTIVATE, registration);
		}
 
		private function registration(e: SendArrayEvent): void
		{
			var loader: URLLoader = new URLLoader;
 
			var v: URLVariables = new URLVariables();
			v.login = e.dataArray[0];
			v.pass = e.dataArray[1];
			v.city = e.dataArray[2];
 
			var req: URLRequest = new URLRequest(Main.REGISTRATION);
			req.method = URLRequestMethod.POST;
			req.data = v;
 
			loader.addEventListener(Event.COMPLETE, endRegistration);
			loader.load(req);
		}
 
		private function endRegistration(e: Event): void
		{
			var answer: String = e.currentTarget.data.toString();
 
			if(answer.indexOf("success") > -1)
			{
				_model.textInfo = "Ви зареєстровані!";
			}
			else
			{
				_model.textInfo = answer;
			}
 
			dispatchEvent(new Event(Event.CHANGE));
		}
	}
}
Код AS1/AS2:
package net.freedomstate.pages.registration
{
	/**
	 * ...
	 * @author Scorpion
	 */
 
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.net.*;
	import net.freedomstate.events.SendArrayEvent;
 
	public class Model extends EventDispatcher  
	{
		private var _textInfo: String;
		private var _citiesArray: Array = [  ];
 
		public function Model(): void
		{
			_textInfo = " "; 
 
			var loader: URLLoader = new URLLoader;
			loader.addEventListener(Event.COMPLETE, load);
			loader.load(new URLRequest(Main.LOADCITYES));
		}
 
		public function load(e: Event): void
		{
			var xmlList: XMLList = (XMLList(e.target.data)).city;
 
			for (var i: int = 0; i < xmlList.length(); i++ )
			{
				_citiesArray[i] = xmlList[i].title_city;
			}
 
			dispatchEvent(new SendArrayEvent(Event.ADDED, _citiesArray))
		}
 
		public function get textInfo(): String
		{
			return _textInfo;
		}
 
		public function get citiesArray(): Array
		{
			return _citiesArray;
		}
 
		public function set textInfo(string: String): void
		{
			_textInfo = string;
		}
	}
}
Страницу регистрации делаю.

Добавлено через 7 минут
Забыл добавить, что список городов из модели загружается нормально. Ошибка вылазит при нажатии на кнопки регистрации.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Что это вообще? Оо
Код AS3:
_controller.dispatchEvent(new SendArrayEvent(Event.ACTIVATE, new Array(_inputLogin.text, _inputPass.text, _choiseCity.selectedItem.label )));
http://help.adobe.com/ru_RU/FlashPla...dispatchEvent()
Меня удивляет как это вообще компилируется
И что это за такой магический SendArrayEvent?
__________________
Ко мне можно и нужно обращаться на ты)

Старый 07.06.2014, 20:39
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 3  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

Регистрация: May 2014
Сообщений: 182
Цитата:
Меня удивляет как это вообще компилируется
А что не так? Не получается рассмотреть чего-то, что помешает скомпилироваться...

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

Регистрация: Jan 2006
Адрес: Москва (Нижний Новгород)
Сообщений: 229
Записей в блоге: 1
Отправить сообщение для KBAC с помощью Skype™
caseyryan,

Цитата:
Меня удивляет как это вообще компилируется
И что это за такой магический SendArrayEvent?
например:
Код AS3:
public class SendArrayEvent extends Event
	{
		public function SendArrayEvent(type:String, array:Array)
		{
			super(type, false, false);
 
			_myArray = array;
		}
 
		private var _myArray:Array;
		public function get myArray():Array
		{
			return _myArray;
		}
	}
2misha, ошибка у вас тут:
Код AS3:
public function Controller(rModel: Model): void
{
	_model = rModel;
 
	this.addEventListener(Event.ACTIVATE, registration);
}
 
private function registration(e: SendArrayEvent): void
{
	//тут падает
}
__________________
Будь проще.

Старый 07.06.2014, 21:26
2misha вне форума Посмотреть профиль Отправить личное сообщение для 2misha Найти все сообщения от 2misha
  № 5  
Ответить с цитированием
2misha

Регистрация: Apr 2014
Сообщений: 97
А почему функция registration компилятору не нравится?

Я ведь во Вью диспатчу SendArrayEvent
Код AS3:
_controller.dispatchEvent(new SendArrayEvent(Event.ACTIVATE, new Array(_inputLogin.text, _inputPass.text, _choiseCity.selectedItem.label )));
И такой же Евент принимаю в Контроллере
Код AS3:
this.addEventListener(Event.ACTIVATE, registration);
 
private function registration(e: SendArrayEvent): void
{
	var loader: URLLoader = new URLLoader;
 
	var v: URLVariables = new URLVariables();
	v.login = e.dataArray[0];
	v.pass = e.dataArray[1];
	v.city = e.dataArray[2];
 
	var req: URLRequest = new URLRequest(Main.REGISTRATION);
	req.method = URLRequestMethod.POST;
	req.data = v;
 
	loader.addEventListener(Event.COMPLETE, endRegistration);
	loader.load(req);
}

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

Регистрация: Jan 2006
Адрес: Москва (Нижний Новгород)
Сообщений: 229
Записей в блоге: 1
Отправить сообщение для KBAC с помощью Skype™
http://help.adobe.com/ru_RU/FlashPla...event:activate

EventDispatcher и так диспатчит Event.ACTIVATE типа Event при активации. Тут вы и ловите ошибку.

Используйте другой тип эвента. А лучше заведите статичные строковые константы для своих кастомных событий прямо в классе кастомного эвента. Чтобы было так:
Код AS3:
new CustomEvent(CustomEvent.MY_CUSTOM_EVENT)
__________________
Будь проще.

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

Регистрация: Apr 2014
Сообщений: 97
Да, спасибо. Теперь работает.

Только вот ещё одного аспекта работы событий не могу понять ...
У меня сейчас так:

В Контроллере:
Код AS3:
_model.dispatchEvent(new SendArrayEvent(SendArrayEvent.SEND_ARRAY));
В Модели:
Код AS3:
this.addEventListener(SendArrayEvent.SEND_ARRAY, endRegistration);
 
private function endRegistration(e: SendArrayEvent): void
{
	dispatchEvent(new Event(Event.CHANGE));
}
Все работает. Но ведь из Контроллера в Модель то массив не надо передавать.

И если напишу так:

В Контроллере:
Код AS3:
_model.dispatchEvent(new Event(Event.CHANGE));
В Модели:
Код AS3:
this.addEventListener(Event.CHANGE, endRegistration);
 
private function endRegistration(e: Event): void
{
	dispatchEvent(new Event(Event.CHANGE));
}
Уже работать не будет.

Старый 07.06.2014, 22:44
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 8  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Только вот ещё одного аспекта работы событий не могу понять ...
У меня сейчас так:

В Контроллере:
Не в контроллере, а в КАШЕ. Контроллер не дсипатчит событий модели, сколько раз говоррить! Это не МВС у вас , а бред сумасшедшего, уж извините за резкость. Я вам в прошлых темах отвечал уже, что вы не верно делаете, но опять те же грабли
__________________
Марк Tween

Старый 08.06.2014, 00:08
2misha вне форума Посмотреть профиль Отправить личное сообщение для 2misha Найти все сообщения от 2misha
  № 9  
Ответить с цитированием
2misha

Регистрация: Apr 2014
Сообщений: 97
Ну тогда напиши пример MVC. Просто три класса, которые будут содержать необходимые ссылки друг на друга, какую-то переменную из Модели и какое-то событие. Ну чтоб было понятно.

Старый 08.06.2014, 00:15
dendead вне форума Посмотреть профиль Отправить личное сообщение для dendead Найти все сообщения от dendead
  № 10  
Ответить с цитированием
dendead

Регистрация: Aug 2013
Сообщений: 73
2misha, вот тут посмотрите: http://www.cyberforum.ru/actionscript/thread577183.html

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

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

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


 


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


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