Форум 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=208146)

2misha 07.06.2014 19:44

Ошибка с конвертацией Евентов
 
Вылазит ошибка [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 минут
Забыл добавить, что список городов из модели загружается нормально. Ошибка вылазит при нажатии на кнопки регистрации.

caseyryan 07.06.2014 20:35

Что это вообще? Оо
Код 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?

LifeIsRhythm 07.06.2014 20:39

Цитата:

Меня удивляет как это вообще компилируется
А что не так? Не получается рассмотреть чего-то, что помешает скомпилироваться...

KBAC 07.06.2014 20:47

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
{
        //тут падает
}


2misha 07.06.2014 21:26

А почему функция 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);
}


KBAC 07.06.2014 21:37

http://help.adobe.com/ru_RU/FlashPla...event:activate

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

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

new CustomEvent(CustomEvent.MY_CUSTOM_EVENT)


2misha 07.06.2014 22:37

Да, спасибо. Теперь работает.

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

В Контроллере:
Код 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));
}

Уже работать не будет.

in4core 07.06.2014 22:44

Цитата:

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

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

2misha 08.06.2014 00:08

Ну тогда напиши пример MVC. Просто три класса, которые будут содержать необходимые ссылки друг на друга, какую-то переменную из Модели и какое-то событие. Ну чтоб было понятно.

dendead 08.06.2014 00:15

2misha, вот тут посмотрите: http://www.cyberforum.ru/actionscript/thread577183.html


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

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