Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Первые шаги в MVC (http://www.flasher.ru/forum/showthread.php?t=208070)

2misha 02.06.2014 02:06

Первые шаги в MVC
 
Итак, я начал изучать MVC. Пробую сделать простенькое приложение: есть текстовое поле, в котором сначала ноль, под ним кнопка. Каждое нажатие кнопки должно увеличивать значение в поле на 50.

Проблема возникла на этапе отсылки события с Модели во Вьювер, хотя вроде-бы делаю по книжке.

Код AS3:

package mvc
{
        /**
        * ...
        * @author Scorpion
        */

 
        import fl.controls.Button;
        import flash.display.Sprite;
        import flash.events.*;
        import flash.text.TextField;
 
        public class View extends Sprite
        {
                private var _model: Model;
                private var _controller: Controller;
 
                private var _textF: TextField;
                private var _button: Button;
 
                public function View(): void
                {
                        _model = new Model();
                        _controller = new Controller();
 
                        _textF = new TextField();
                        _textF.x = 200;
                        _textF.y = 200;
                        _textF.text = String(_model.value);
                        addChild(_textF);
 
                        _button = new Button();
                        _button.x = 200;
                        _button.y = 250;
                        addChild(_button);
 
                        _button.addEventListener(MouseEvent.CLICK, request_change);
 
                        _model.addEventListener(Event.CHANGE, newValue);
                }
 
                private function request_change(e: Event): void
                {
                        _controller.dispatchEvent(new Event("request_change"));
                }
 
                private function newValue(e: Event): void
                {
                        _textF.text = String(_model.value);
                }
        }
}

Код AS3:

package mvc
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.events.Event;
        import flash.events.EventDispatcher;
 
        public class Controller extends EventDispatcher
        {
                private var _model: Model;
 
                public function Controller(): void
                {
                        _model = new Model();
 
                        this.addEventListener("request_change", change_value);
                }
 
                private function change_value(e: Event): void
                {
                        _model.dispatchEvent(new Event("change_value"));
                }
        }
}

Код AS3:

package mvc
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.events.Event;
        import flash.events.EventDispatcher;
 
        public class Model extends EventDispatcher
        {
                private var _num: int = 0;
 
                public function Model(): void
                {
                        this.addEventListener("change_value", change_value);
                }
 
                public function get value(): int
                {
                        return _num;
                }
 
                private function change_value(e: Event): void
                {
                        _num += 50;
 
                        dispatchEvent(new Event(Event.CHANGE));
                }
        }
}

Ну и в Мейне вызвал:
Код AS3:

view = new View();
addChild(view);

Трейсами проверил, что отсылка события с Вьювера в Контроллер, и с Контроллем в Модель, происходит нормально. А с Модели во Вьювер - нет. Что же я сделал не так?

ZackMercury 02.06.2014 02:08

У вас 2 разных модели, одна в контроллере, другая во View.
Оператор new создаёт новый экземпляр класса, а не использует существующий.

2misha 02.06.2014 02:14

Стал передавать модель из Вьюва как аргумент в Контроллер - заработало. Спасибо.

Но может я ещё что не грамотно сделал. Укажите на все ошибки, пожалуйста.

caseyryan 02.06.2014 08:21

Ошибка тут в том, что во View создается модель и контроллер. Так быть не должно. В контроллере должны создаваться модель и вью. И контроллер должен разруливать взаимоотношения между вью и моделью. Сами они не должны знать друг о друге ничего.

ZackMercury 02.06.2014 08:36

Цитата:

Сами они не должны знать друг о друге ничего.
А как насчёт View слушать Model? Я вроде читал где-то на форуме, что Вьюшки должны быть подписаны на события изменения Model。

caseyryan 02.06.2014 09:05

Не должны они слушать события модели. Их должен слушать контроллер. Если вьюшка будет слушать модель, это приведет к связанности. Нафиг тут тогда вообще MVC. Связанный г-код можно и без него нагородить.

ZackMercury 02.06.2014 09:14

Видимо книжку всё-таки стоит почитать :)

caseyryan 02.06.2014 09:49

Книжки всегда стоит читать ;)

Wolsh 02.06.2014 11:15

Полегче.. чтобы подписаться на события от Модели не нужна никакая связность. Потому и используются события.

caseyryan 02.06.2014 11:20

Да, но не вью должна подписываться на них. Иначе без ссылки на модель во вью не обойтись.


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

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