|
|
|||||
Регистрация: Apr 2014
Сообщений: 97
|
Первые шаги в MVC
Итак, я начал изучать MVC. Пробую сделать простенькое приложение: есть текстовое поле, в котором сначала ноль, под ним кнопка. Каждое нажатие кнопки должно увеличивать значение в поле на 50.
Проблема возникла на этапе отсылки события с Модели во Вьювер, хотя вроде-бы делаю по книжке. 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); } } } 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")); } } } 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)); } } } Трейсами проверил, что отсылка события с Вьювера в Контроллер, и с Контроллем в Модель, происходит нормально. А с Модели во Вьювер - нет. Что же я сделал не так? |
|
|||||
У вас 2 разных модели, одна в контроллере, другая во View.
Оператор new создаёт новый экземпляр класса, а не использует существующий.
__________________
There is no thing in this world that is not simple. |
|
|||||
Регистрация: Apr 2014
Сообщений: 97
|
Стал передавать модель из Вьюва как аргумент в Контроллер - заработало. Спасибо.
Но может я ещё что не грамотно сделал. Укажите на все ошибки, пожалуйста. |
|
|||||
Ошибка тут в том, что во View создается модель и контроллер. Так быть не должно. В контроллере должны создаваться модель и вью. И контроллер должен разруливать взаимоотношения между вью и моделью. Сами они не должны знать друг о друге ничего.
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Цитата:
__________________
There is no thing in this world that is not simple. |
|
|||||
Не должны они слушать события модели. Их должен слушать контроллер. Если вьюшка будет слушать модель, это приведет к связанности. Нафиг тут тогда вообще MVC. Связанный г-код можно и без него нагородить.
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Полегче.. чтобы подписаться на события от Модели не нужна никакая связность. Потому и используются события.
__________________
Reality.getBounds(this); |
Часовой пояс GMT +4, время: 11:47. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|