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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.11.2008, 22:39
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 31  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
__etc, со спрайтом понятно.

А как быть с каким-нибудь List? Там selectedItem изменяется не извне контроллером, а изнутри все прописано.

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

Регистрация: Sep 2002
Сообщений: 30,787
Ну и что, что не изменяется? Тот же selectedIndex можно задать контроллером, в чём проблема? Значение индекса выбранного элемента можно хранить в модели, если это требуется сохранить. В противном случае индекс живет, пока живет контроллер.

Старый 14.11.2008, 22:55
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 33  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
__etc, это понятно. Но я имею в виду примерно следующее:
Код AS3:
var controller:...
var model:...
 
var lst:List = new List();
addChild(lst);
lst.dataProvider = new DataProvider(...);
lst.addEventListener(Event.CHANGE, listChangeHandler);
model.addEventListener(Event.CHANGE, modelChangeHandler);
 
function listChangeHandler(e:Event):void{
  controller.setSelectedItem(lst.selectedItem); // => модель испустила CHANGE
}
 
function modelChangeHandler(e:Event):void{
 lst.selectedItem = model.getSelectedItem(); //и вот тут мы во второй раз пытаемся выставить selectedItem List'у, хотя мышкой оно уже выставилось
}
Как тут можно по-другому-то?

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

Регистрация: Sep 2002
Сообщений: 30,787
Для листа dataProvider-ом должна быть model. Это первое.
Второе: у контроллера не должно быть никаких публичных методов вообще, он должен сам создать лист (если требуется), отдать ему модель, сам подписаться на его события и менять модель.

Старый 14.11.2008, 23:26
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 35  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
Это значит, что в программе взаимодействия листа и его внешнего управляющего элемента selectedItem вообще не должно находиться в модели. Взаимодействие элементов происходит только на уровне контроллера.

Пример - взаимодействие двух листов: выбираешь во втором => должно выбираться в первом и наоборот.

модель:
Код AS3:
private var _someData:XML = new XML(...);
public function get someData():XML { return someData; }
Контроллер:
Код AS3:
var lst1:List = new List();
addChild(lst1);
lst1.dataProvider = new DataProvider(model.someData);
lst1.addEventListener(Event.CHANGE, lst1ChangeHandler);
 
var lst2:List = new List();
addChild(lst2);
lst2.dataProvider = new DataProvider(bigModel.someData);
lst2.addEventListener(Event.CHANGE, lst1ChangeHandler);
 
function lst1ChangeHandler(e:Event):void{
 lst2.selectedItem = lst1.selectedItem;
}
 
function lst2ChangeHandler(e:Event):void{
 lst1.selectedItem = lst2.selectedItem;
}
Представление - это сами листы.

Правильно я понимаю?

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

Регистрация: Sep 2002
Сообщений: 30,787
Нет, неправильно. Хотя бы потому что у разных моделей ни один узел в одном XML не равен другому узлу из другого XML. Соответственно хендлеры работать не будут. Необходимо использовать либо selectedIndex (что обычно проще), либо находить по какому-то критерию от узла одного XML другой узел другого XML и ставить его в качестве selectedItem у второго листа. Безусловно, этим занимается контроллер.

Старый 14.11.2008, 23:58
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 37  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
Все ясно, спасибо!

Старый 25.11.2008, 01:26
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 38  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
__etc, очень извиняюсь но у меня опять назрел вопрос из той же серии. Все никак не могу понять...

1) А как быть с текстовыми полями? Например, контроллер - текстовое инпут-поле, рядом с ним кнопка. По нажатию на кнопку в модели апдейтится поле text, туда посылается переменная text из текстового поля. Но это же поле модели может изменить кто-либо другой => контроллер слушает события модели на предмет апдейта этого поля text.

По нажатию на кнопку я делаю апдейт модели. Модель испускает событие об изменении поля text внутри себя. Из-за этого события вызывается функция контроллера, которая апдейтит текстовое поле. Но оно уже изменилось до этого средствами флэша => эта функция вызвалась вхолостую.

2) А может ли контроллер быть наследником визуального класса, например Sprite?
Ведь чтобы расположить вьюверы на экране, нужны какие-то данные (хотя бы stage). Или width, height для того, чтобы расположить вьюверы каким-то определенным образом.

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

Регистрация: Sep 2002
Сообщений: 30,787
1) Это каким образом изменение модели прошло в обход контроллера? Контроллер, если и слушает изменение модели, то только лишь те изменения, которые требуют добавления/удаления вьюверов. В противном случае, изменения отслеживаются исключительно вьюверами. Ну а если подходить к возможным замкнутым рекурсиям, то в любом случае (в любом, это важно), в сеттере должна стоять проверка на текущее значение, типа if (this._somevalue === value) return;.

2) Он может иметь ссылку на контейнер-вьювер, но сам по себе визуальным объектом не может быть ни при каких обстоятельствах.

Старый 25.11.2008, 02:45
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 40  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
__etc, ну зачем категорично? это комбо-система ... пример: любой уиконтрол

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:06.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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