Спасибо, начинаю понимать.
1) Я так понимаю в контроллер всегда передаётся DisplayObjectContainer, говорящий куда пихнуть вьюшку?
б) я имею ввиду что раз контроллер создаёт и вьюшку, и модель то он сохраняет их ссылки. Ну в принципе вопрос риторический, не сохранять было бы глупо.
в) а как можно ссылаться снаружи на то, что было создано внутри? Диспатчится событие и на неё начинают ссылаться?
г) теперь понял что это, думал о другом =)
Такс, применив свои знания набросал это в коде, посмотри пожалуйста:
Базовый класс:
Код AS3:
package
{
import flash.display.Sprite;
public class JustMain extends Sprite
{
public function JustMain()
{
super();
var controller:Controller = new Controller(this);
}
}
}
Контроллер:
Код AS3:
package
{
import flash.display.DisplayObjectContainer;
import flash.events.Event;
import flash.events.MouseEvent;
public class Controller
{
private var _model:Model = new Model();
private var _viewer:Viewer = new Viewer();
private var _container:DisplayObjectContainer;
public function Controller(container:DisplayObjectContainer)
{
_container = container;
init();
}
private function init():void
{
_container.addChild(_viewer);
_model.addEventListener(Event.CHANGE, onModelChange);
_viewer.addEventListener(MouseEvent.CLICK, onViewerClick);
}
private function onViewerClick(e:MouseEvent):void
{
_model.change(Math.random() * 400, Math.random() * 400);
}
private function onModelChange(e:Event):void
{
_viewer.updatePositions(_model.x, _model.y);
}
}
}
Моделька:
Код AS3:
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
public class Model extends EventDispatcher
{
//no getters/setters, just example
public var x:Number = 0;
public var y:Number = 0;
public function Model()
{
super(null);
}
public function change(x:Number, y:Number):void {
this.x = x;
this.y = y;
super.dispatchEvent(new Event(Event.CHANGE));
}
}
}
И вьюшка:
Код AS3:
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Viewer extends Sprite
{
public function Viewer()
{
super();
init();
}
private function init():void
{
var someSprite:Sprite = new Sprite();
someSprite.graphics.beginFill(0);
someSprite.graphics.drawCircle(0, 0, 50);
someSprite.graphics.endFill();
super.addChild(someSprite);
someSprite.addEventListener(MouseEvent.CLICK, super.dispatchEvent);
}
public function updatePositions(x:Number,y:Number):void {
this.x = x;
this.y = y;
}
}
}
По клику на кружок событие идёт в контроллер, оттуда просит модель изменить данные, модель данные меняет и говорит контроллеру, который обновляет вьюшку.
Возникает отсюда уже несколько вопросов:
1) Чтобы было совсем идеально-правильное MVC на твой взгляд, что нужно добавить, а что убрать?
2) Наверное, на столь простом примере не видно - но зачем такой полёт данных? Ведь если контроллер изменяет все данные, а моделька их всего лишь хранит - тогда, наверное, контроллеру уж точно видно что данные изменены и надо что то сказать вьюшке, зачем в моделе уведомлять об изменении?
3) А если я ф-цию change заменю 2-мя сеттерами, тогда я дважды вызову уведомление об обновлении, что плохо. Как быть?
Было бы очень здорово, если бы ты ткнул на конкретно этом примере, как сделать лучше.