Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0 > Статьи

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.09.2010, 17:24
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 131  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Пример.
За все время приложение запросит следующие данные:

- список друзей некоего пользователя
- список альбомов пользователя
- список фотографий из альбома

значит все эти модели должны быть публичными свойствами mainController:

Код:
public var friendsModel:FriendsModel = new FriendsModel();
public var albumsModel:AlbumsModel = new AlbumsModel();
public var photosModel:PhotosMidel = new PhotosModel();
и когда дело дойдет до создания списка фотографий, то мы в контроллере диалогового окна someWindowController, который имеет свои model и view делаем так:

Код:
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.
Старый 10.09.2010, 17:30
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 132  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Нет, не туда.
Френды и прочая должны быть свойствами UserModel и создаваться сразу с ним. ListView получает линк на user.photos. Контроллер SomeWindowController имеет линк либо на user, либо весь model (хотя он ему и не нужен), у которого есть currentUser.

Старый 10.09.2010, 19:11
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 133  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
т.е. если переписать, то все модели должны быть свойствами mainModel:

Код:
public var friendsModel:FriendsModel = new FriendsModel();
public var albumsModel:AlbumsModel = new AlbumsModel();
public var photosModel:PhotosMidel = new PhotosModel();
someWindowController создаем так:

Код:
var someWindowController:ListController = new WindowController(
	mainController,		// ссылка на основной контроллер
	mainModel,		// ссылка на основной контроллер
	someWindowModel,
	someWindowView
);
т.е. окно всегда среди прочих параметров принимает еще и mainModel, потому что часто создает группы MVC, где модель — это что-то из списка первой троицы.

а уже конкретный список создаем так:

Код:
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!

Старый 10.09.2010, 19:39
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 134  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
addChild не надо. И вообще, я не очень вкурил, где располагается последний код и что такое this.model почему это не mainModel.

Старый 10.09.2010, 19:42
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 135  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
последний код располагается в someWindowController в том месте, где надо создать в окне список друзей.
а почему не mainModel... эээ... я просто насмотрелся этой схемы: http://www.flasher.ru/forum/showpost...54&postcount=2, а там модели "крепятся" к родителю, а не к корню. хотя этот момент мне не понятен в той схеме.
__________________
Поймай яблоко 2!

Старый 10.09.2010, 19:46
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 136  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Никуда они не крепятся, они связаны иерархической связью и все, при создании контроллеров остаются на месте. addChild одного элемента в две разных модели сделать нельзя.

Старый 10.09.2010, 19:51
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 137  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
понял.
etc, помощь была неоценимой, спасибо.
пойду пробовать.
__________________
Поймай яблоко 2!

Старый 21.09.2010, 22:05
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 138  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
В этой теме затронут вопрос, с которым я давно не могу разобраться: как же все-таки делать иерархию mvc?

Из вышесказанного я смог выделить несколько мыслей:
1. Модель у нас одна, все слушают её и пишут в неё.
2. Иерархия модели аналогична иерархии DisplayList'а.

А что с контроллерами? Тоже ветвятся? Тогда откуда взялось обращение дочерних контроллеров к родительским? Кто кому на кого передает ссылки? Блин, это настолько непонятно, что я до сих пор не могу правильно сформулировать вопрос.

Допустим, есть игровое приложение, состоящее из двух больших кусков: "курилка", где можно создать игру либо присоединиться к существующей, и собственно сама игра.
Document Class создает главный контроллер и передает ему ссылку на себя же в качестве контейнера, этот контроллер создает модель, затем создает вид, передавая ему модель, и добавляет в контейнер. Главная триада up and running.
Теперь нужно добавить триаду, которая будет отвечать за курилку. Как это должно произойти? Как она должна быть связана с главной триадой?
__________________
тонкий тролль, осеянный благодатью

Старый 21.09.2010, 22:59
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 139  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Document Class создает главный контроллер и передает ему ссылку на себя же в качестве контейнера, этот контроллер создает модель, затем создает вид, передавая ему модель, и добавляет в контейнер. Главная триада up and running.
Всё верно.
Цитата:
Теперь нужно добавить триаду, которая будет отвечать за курилку. Как это должно произойти? Как она должна быть связана с главной триадой?
Контроллер главный создаёт контроллер курилки. Он создаёт модель и вьюшку. Или главный контроллер создаёт всё трио - это не важно. Главное чтобы они все создались.

Главная модель имеет в себе ссылку на дочернюю модель (модель курилки). В главной вьюшке вложена вьюшка курилки. Контроллер главный, само собой, имеет ссылку на то что он сам создал - контроллер курилки. Когда из курилки выходят - курилка контроллер меняет курилку модель. Курилка модель в свою очередь сообщает об этом главной моделе (событием), главная модель от этого меняется. Главный контроллер, узнав о том что главная модель изменилась и говорит ему, что из курилки вышли - убивает курилку.

Старый 22.09.2010, 14:52
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 140  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Спасибо, вроде прояснилось.
Еще вопрос: каким образом из дочерней триады достучаться до родительской модели?
Сейчас у меня все устроено вот так:
Код AS3:
/**
 * Установка свойства. Если в качестве значения передать 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.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:02.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.