|
|
|||||
Lorem ipsum
|
Пример.
За все время приложение запросит следующие данные: - список друзей некоего пользователя - список альбомов пользователя - список фотографий из альбома значит все эти модели должны быть публичными свойствами mainController: public var friendsModel:FriendsModel = new FriendsModel(); public var albumsModel:AlbumsModel = new AlbumsModel(); public var photosModel:PhotosMidel = new PhotosModel(); var somePhotosListView:ListView = new ListView(mainController.photosModel); var somePhotosListController:ListController = new ListController( mainController, // ссылка на основной контроллер mainController.photosModel, // модель this.somePhotosListView:ListView // вид ); this.model.addChild(mainController.photosModel); this.view.addChild(this.somePhotosListView); this.addChild(somePhotosListController); Добавлено через 2 минуты Ну насчет публичных свойств в mainController я поспешил — достаточно дать доступ через get
__________________
Поймай яблоко 2! Последний раз редактировалось Zebestov; 10.09.2010 в 17:27. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Нет, не туда.
Френды и прочая должны быть свойствами UserModel и создаваться сразу с ним. ListView получает линк на user.photos. Контроллер SomeWindowController имеет линк либо на user, либо весь model (хотя он ему и не нужен), у которого есть currentUser. |
|
|||||
Lorem ipsum
|
т.е. если переписать, то все модели должны быть свойствами mainModel:
public var friendsModel:FriendsModel = new FriendsModel(); public var albumsModel:AlbumsModel = new AlbumsModel(); public var photosModel:PhotosMidel = new PhotosModel(); var someWindowController:ListController = new WindowController( mainController, // ссылка на основной контроллер mainModel, // ссылка на основной контроллер someWindowModel, someWindowView ); а уже конкретный список создаем так: var somePhotosListView:ListView = new ListView(mainModel.photosModel); var somePhotosListController:ListController = new ListController( mainController, // ссылка на основной контроллер mainModel.photosModel, // модель this.somePhotosListView // вид ); this.model.addChild(mainModel.photosModel); // и вот этого я так понимаю делать не надо? this.view.addChild(this.somePhotosListView); this.addChild(somePhotosListController);
__________________
Поймай яблоко 2! |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
addChild не надо. И вообще, я не очень вкурил, где располагается последний код и что такое this.model почему это не mainModel.
|
|
|||||
Lorem ipsum
|
последний код располагается в someWindowController в том месте, где надо создать в окне список друзей.
а почему не mainModel... эээ... я просто насмотрелся этой схемы: http://www.flasher.ru/forum/showpost...54&postcount=2, а там модели "крепятся" к родителю, а не к корню. хотя этот момент мне не понятен в той схеме.
__________________
Поймай яблоко 2! |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Никуда они не крепятся, они связаны иерархической связью и все, при создании контроллеров остаются на месте. addChild одного элемента в две разных модели сделать нельзя.
|
|
|||||
Lorem ipsum
|
понял.
etc, помощь была неоценимой, спасибо. пойду пробовать.
__________________
Поймай яблоко 2! |
|
|||||
strange mood
|
В этой теме затронут вопрос, с которым я давно не могу разобраться: как же все-таки делать иерархию mvc?
Из вышесказанного я смог выделить несколько мыслей: 1. Модель у нас одна, все слушают её и пишут в неё. 2. Иерархия модели аналогична иерархии DisplayList'а. А что с контроллерами? Тоже ветвятся? Тогда откуда взялось обращение дочерних контроллеров к родительским? Кто кому на кого передает ссылки? Блин, это настолько непонятно, что я до сих пор не могу правильно сформулировать вопрос. Допустим, есть игровое приложение, состоящее из двух больших кусков: "курилка", где можно создать игру либо присоединиться к существующей, и собственно сама игра. Document Class создает главный контроллер и передает ему ссылку на себя же в качестве контейнера, этот контроллер создает модель, затем создает вид, передавая ему модель, и добавляет в контейнер. Главная триада up and running. Теперь нужно добавить триаду, которая будет отвечать за курилку. Как это должно произойти? Как она должна быть связана с главной триадой?
__________________
тонкий тролль, осеянный благодатью |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Цитата:
Цитата:
Главная модель имеет в себе ссылку на дочернюю модель (модель курилки). В главной вьюшке вложена вьюшка курилки. Контроллер главный, само собой, имеет ссылку на то что он сам создал - контроллер курилки. Когда из курилки выходят - курилка контроллер меняет курилку модель. Курилка модель в свою очередь сообщает об этом главной моделе (событием), главная модель от этого меняется. Главный контроллер, узнав о том что главная модель изменилась и говорит ему, что из курилки вышли - убивает курилку.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
strange mood
|
Спасибо, вроде прояснилось.
Еще вопрос: каким образом из дочерней триады достучаться до родительской модели? Сейчас у меня все устроено вот так: /** * Установка свойства. Если в качестве значения передать null, свойство удаляется. * @param name - имя свойства * @param value - значение */ public function setProperty(name:String, value:*){ //Запоминаем старое значение var oldValue :* = this.data[name]?this.data[name]:null; //Если новое значение такое же - ничего не делаем if(value == oldValue) return; //При получении null удаляем свойство if(oldValue && (value == null)){ //Если это дочерняя модель - отписываемся от неё if(oldValue is Model){ oldValue.removeEventListener(ModelChangeEvent.PROPERTY_CHANGE, this.dispatchEvent); }//if //Сносим delete this.data[name]; }else{ //Устанавливаем значение this.data[name] = value; //Если это дочерняя модель - подписываемся на её события if(value is Model){ value.addEventListener(ModelChangeEvent.PROPERTY_CHANGE, this.dispatchEvent); }//if }//if //Сообщаем об изменении this.dispatchEvent(new ModelChangeEvent(ModelChangeEvent.PROPERTY_CHANGE, name, oldValue, value)); }//setProperty Пока сделал ссылку на родителя просто отдельным полем.
__________________
тонкий тролль, осеянный благодатью |
Часовой пояс GMT +4, время: 17:02. |
|
« Предыдущая тема | Следующая тема » |
|
|