|
|
|||||
Регистрация: Feb 2011
Сообщений: 4
|
Логика работы MVC
Допустим, у меня есть необходимость написать приложение с возможностью перетаскивания предметов.
Применяя модель MVC я пишу public class ModelClass extends EventDispatcher { private var objects:Dictionary = new Dictionary(); private var numObjects:Number = 0; public function ModelClass () { } public function getObject (id:String) : RoomObject{ //получение объекта по id return objects[id]; } public function addObject (obj:RoomObject) { //добавление объекта в массив объектов objects[obj.id] = obj; numObjects++; trace("Object " + obj.id + " is added"); obj.addEventListener(ModelChange.OBJECT, OnObjectChange); dispatchEvent(new ModelChange(ModelChange.MODEL)); } public function OnObjectChange(e:ModelChange) { //событие изменения модели вызывается при изменении объекта в массиве dispatchEvent(new ModelChange(ModelChange.MODEL)); } Описание Контроллера public class ControllerPlain extends EventDispatcher { private var model_:ModelClass; private var view_ :MainPlainView; private var host_ :DisplayObjectContainer; public function ControllerPlain(host:DisplayObjectContainer) { model_ = new ModelClass(); view_ = new MainPlainView(); model_.addEventListener(ModelChange.MODEL, updateView); host_ = host; } public function renderView() { //добавление view в display list if (host_ && view_) { host_.addChild(view_); } } public function addObject(type:String, pt:MdlCordList, sz:MdlSizeList) { //метод добавления объекта, который будет непосредственно вызываться var newObject:RoomObject = new RoomObject(); model_.addObject(newObject); } public function updateView () { //хенлдер события изменения модели //по сути полная перерисовка view по словарю объектов for each(var object:RoomObject in model_.objs) { view_.renderObject(object.id); } } } } Модель и контроллер я построил согласно описанию MVC, которое нашел на этом форуме. Теперь вопрос Мне необходимо, чтобы при перетаскивании изображения некоего предмета, менялись его координаты в модели, в словаре objs. Если дальше писать событийную цепочку, получится так Перетаскивание объекта в словаре View -> Событие изменения View -> Обработчик в Контроллере -> Изменение координат объекта в модели -> Событие изменения модели -> Обработчик в контроллере -> Изменение View... Так вот, как лучше всего оборвать эту "цепочку"? Пока что я могу менять модель только с помощью view путем перетаскивания спрайтов. То есть в идеале я хочу получить вот что Перетаскивание объекта в словаре View -> Событие изменения View -> Обработчик в Контроллере -> Изменение координат в модели Если же мне понадобится изменить сначала модель, а потом view (пока этого не требуется, но потребуется) мне нужна будет такая цепочка событий Изменение координат объекта в модели -> Событие изменения модели -> Обработчик в контроллере -> Изменение объекта View Как мне лучше всего дифференцировать события и методы для обработки разных типов взаимодействия view и модели ? В идеале я хочу получить возможно менять модель и view как от модели ко view, так и от view к модели. И второй вопрос, это стоит ли апдейтить модель всю сразу при изменении 1 объекта? Допустим у меня будет 100 объектов, а перетаскиваю я 1. В базовом описании модели MVC апдейтится полностью модель, то есть по всем ее параметром она полностью перерисовывается. Стоит ли написать методы, чтобы можно было апдейтить модель и view соответственно по одному, а не перерисовать весь словарь моих объектов RoomObject ? Последний раз редактировалось braun3812; 09.10.2013 в 19:51. Причина: опечатка |
|
|||||
не по теме: собственно, интересно наблюдать за метоморфозой форума - раньше самые рейтовые темы были про кнопки, теперь про МВЦ. растемс )
по теме: собственно эту тему уже тут обмусолили столько раз сколько те же пресловутые кнопки. именно по этой теме: я понимаю желание понять и выстроить приложение по канонам МВЦ, но оно, в данном случае, "слегка" усложнено. хотя бы взять вашу главную модель: тут обычный хэш объектов вполне себе справится, а диспатчить изменения должны ваши RoomObject для конкретной своей подписавшийся на это вьюхе. действия пользователя через вью должны ловиться в контроллере, который принимает решение и меняет модель этой вьюхи, та поймав изменения от своей модельки меняет свое визуальное состояние. ну, как то так.
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
[+1 25.10.13]
[+4 18.03.14] |
model_ где вы такой синтаксис узрели при описании MVC?
|
|
|||||
а какое отношение конвенция имеет к сути вопроса? )
хотя , пожалуй , в этом отношении тоже следует подумать/почитать )
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
[+1 25.10.13]
[+4 18.03.14] |
Цитата:
|
|
|||||
я же не знаю что там контроллер делает с моделями, но что-то в любом случае делает..буть-то оффлайн или онлайн приложение.
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
[+1 25.10.13]
[+4 18.03.14] |
Ответ с сервера совсем не обязательно меняет модель. Если логика на клиенте, т.е. толстый клиент, то логика может разрешать update вида, а может не разрешать, и сама посылать реквесты на сервер.
|
|
|||||
Цитата:
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
Часовой пояс GMT +4, время: 20:23. |
|
« Предыдущая тема | Следующая тема » |
|
|