|
|
|||||
Регистрация: Apr 2014
Сообщений: 97
|
Ошибка с конвертацией Евентов
Вылазит ошибка [Fault] exception, information=TypeError: Error #1034: Type Coercion failed: cannot convert flash.events::Event@8e41061 to net.freedomstate.events.SendArrayEvent.
Хотя в функциях у меня тип события, что принимается, соответствует типу, что отправляется. Может я не учел какого-то нюанса работы событий? Посмотрите пожалуйста. 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; } } } 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)); } } } 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 минут Забыл добавить, что список городов из модели загружается нормально. Ошибка вылазит при нажатии на кнопки регистрации. |
|
|||||
Что это вообще? Оо
_controller.dispatchEvent(new SendArrayEvent(Event.ACTIVATE, new Array(_inputLogin.text, _inputPass.text, _choiseCity.selectedItem.label ))); Меня удивляет как это вообще компилируется И что это за такой магический SendArrayEvent?
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
[+1 22.07.14]
[+4 12.08.14] [+1 09.02.15] Регистрация: May 2014
Сообщений: 182
|
Цитата:
|
|
|||||
caseyryan,
Цитата:
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; } }
__________________
Будь проще. |
|
|||||
Регистрация: Apr 2014
Сообщений: 97
|
А почему функция registration компилятору не нравится?
Я ведь во Вью диспатчу SendArrayEvent _controller.dispatchEvent(new SendArrayEvent(Event.ACTIVATE, new Array(_inputLogin.text, _inputPass.text, _choiseCity.selectedItem.label ))); 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); } |
|
|||||
http://help.adobe.com/ru_RU/FlashPla...event:activate
EventDispatcher и так диспатчит Event.ACTIVATE типа Event при активации. Тут вы и ловите ошибку. Используйте другой тип эвента. А лучше заведите статичные строковые константы для своих кастомных событий прямо в классе кастомного эвента. Чтобы было так:
__________________
Будь проще. |
|
|||||
Регистрация: Apr 2014
Сообщений: 97
|
Да, спасибо. Теперь работает.
Только вот ещё одного аспекта работы событий не могу понять ... У меня сейчас так: В Контроллере: В Модели: this.addEventListener(SendArrayEvent.SEND_ARRAY, endRegistration); private function endRegistration(e: SendArrayEvent): void { dispatchEvent(new Event(Event.CHANGE)); } И если напишу так: В Контроллере: В Модели: Уже работать не будет. |
|
|||||
[+4 06.05.14]
|
Цитата:
__________________
Марк Tween |
|
|||||
Регистрация: Apr 2014
Сообщений: 97
|
Ну тогда напиши пример MVC. Просто три класса, которые будут содержать необходимые ссылки друг на друга, какую-то переменную из Модели и какое-то событие. Ну чтоб было понятно.
|
|
|||||
Регистрация: Aug 2013
Сообщений: 73
|
2misha, вот тут посмотрите: http://www.cyberforum.ru/actionscript/thread577183.html
|
Часовой пояс GMT +4, время: 23:19. |
|
« Предыдущая тема | Следующая тема » |
|
|