![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2010
Сообщений: 189
|
Здравствуйте. Хочу сделать все не как всегда, а правильно. Итак, есть контроллер
package { import flash.display.*; import flash.events.*; import flash.utils.*; public class Controller extends Sprite { public var view:View; public var xmlWohnungen; public function Controller() { this.addEventListener(Event.ADDED_TO_STAGE,init); } private function init(event:Event):void { view = new View; this.addChild(view); xmlWohnungen = new XMLLoader(); } } } и есть XMLLoader, он же парсер, из него пойдут данные в Модель : package { import flash.xml.*; import flash.events.*; import flash.net.*; public class XMLLoader { public var xmlDaten:XML; public var xmlDateiDaten:URLLoader; public var myURLRequest:URLRequest; public function XMLLoader() { xmlDateiDaten = new URLLoader(); myURLRequest = new URLRequest(); myURLRequest.url = "data.xml"; xmlDateiDaten.load(myURLRequest); xmlDateiDaten.addEventListener(Event.COMPLETE, weiter); } private function weiter(e:Event) { xmlDaten = new XML(e.target.data); } } } Помогите пожалуйста с dispatchEvent в XMLLoader и addEventListener в контроллере. P.S: 1. Я знаю, что можно сделать проще и хитрее, но хочется сделать "по правилам". 2. Материалы по MVC на форуме читал, но не смог приспособить(угадал все буквы, но слово сложить не смог) Последний раз редактировалось Nemez; 21.11.2010 в 22:13. |
|
|||||
|
1) контроллер наследуется от EventDispatcher
2) Контроллер создает себе View и Model (Model У Вас вообще не заметил) 3) Контроллер грузит данные (т.е. выполняет функции Вашего XMLLoader'а) и по окончании загрузки пихает их в Model 4) Model диспатчит евент при изменении данных (т.е. у нее срабатывает сеттер, в котором диспатчится событие) 5) View подписывается на события Model и обновляет себя когда нужно PS - у Veiw доступ к Model есть только на чтение - у Controller доступ к Model и на запись, и на чтение - у View есть ссылка на Model - у Controller есть ссылки и геттеры для Model и View (так как он их создает) - у Model нет ссылок ни на кого и она наследуется от EventDispatcher
__________________
...вселенская грусть |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
XMLLOader - часть контроллера. после того какон загрузит xml пусть "парсит" её. Т.е. изменяет данные модели исходя их xml данных. Если виды подписаны на изменение модели - они всё отобразят.
__________________
Отряд Котовскага |
|
|||||
|
Регистрация: Jun 2010
Сообщений: 189
|
Спасибо за ответ,
Цитата:
Цитата:
|
|
|||||
|
Цитата:
Ну, насчет кода - как-то так: package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; /* * @author gloomyBrain */ public class Main extends Sprite { private var _controller:Controller; public function Main():void { if (super.stage) this.init(); else super.addEventListener(Event.ADDED_TO_STAGE, init); } private function init(event:Event = null):void { super.removeEventListener(Event.ADDED_TO_STAGE, init); super.stage.align = StageAlign.TOP_LEFT; super.stage.scaleMode = StageScaleMode.NO_SCALE; // entry point _controller = new Controller(); super.addChild(_controller.view); _controller.loadXML(); } } } package { import flash.events.Event; import flash.events.EventDispatcher; /* * @author gloomyBrain */ public class Controller extends EventDispatcher { private var _view:View; private var _model:Model; public function Controller() { super(); _model = new Model(); _view = new View(_model); } public function loadXML():void { // грузщим xml } private function onXMLComplete(event:Event):void { // тут заполняем модель полученными данными _model.data = ... ; } public function get view():View { return _view; } public function get model():Model { return _model; } } } package { import flash.events.IEventDispatcher; /* * @author gloomyBrain */ public interface IModel extends IEventDispatcher{ function get data():Object; } } package { import flash.events.Event; import flash.events.EventDispatcher; /* * @author gloomyBrain */ public class Model extends EventDispatcher implements IModel { private var _data:Object = null; public function Model() { super(); } public function get data():Object { return _data; } public function set data(value:Object):void { _data = value; super.dispatchEvent(new Event(Event.CHANGE)); } } } package { import flash.display.Sprite; import flash.events.Event; /* * @author gloomyBrain */ public class View extends Sprite { private var _model:IModel; // интерфейс, т.к. доступ только на чтение public function View(model:IModel) { super(); _model = model; // слушаем изменения модели _model.addEventListener(Event.CHANGE, redraw); } private function redraw(event:Event):void { var newObject:Object = _model.data; // здесь перерисовываемся } } }
__________________
...вселенская грусть |
|
|||||
|
Регистрация: Jun 2010
Сообщений: 189
|
Это шикарно. Все работает, как часы. Вопрос вдогонку, у меня на View лежат еще несколько классов - мувиклипов. Правильно ли я понял, в каждом из них я могу так же прописать :
? |
|
|||||
|
Ну, по идее, если модель одна для всех View можно
а) обновлять эти View из родительской View б) передавать в каждую View эту самую модель, и пусть они сами перерисовываются, как им угодно
__________________
...вселенская грусть |
|
|||||
|
Регистрация: Jun 2010
Сообщений: 189
|
Большое Вам спасибо.
|
|
|||||
|
Цитата:
Цитата:
Цитата:
P.S. начал писать super таки? =) Крутой.)
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Jun 2010
Сообщений: 189
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 22:23. |
|
|
« Предыдущая тема | Следующая тема » |
|
|