![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
__etc, со спрайтом понятно.
А как быть с каким-нибудь List? Там selectedItem изменяется не извне контроллером, а изнутри все прописано. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Ну и что, что не изменяется? Тот же selectedIndex можно задать контроллером, в чём проблема? Значение индекса выбранного элемента можно хранить в модели, если это требуется сохранить. В противном случае индекс живет, пока живет контроллер.
|
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
__etc, это понятно. Но я имею в виду примерно следующее:
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'у, хотя мышкой оно уже выставилось } |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Для листа dataProvider-ом должна быть model. Это первое.
Второе: у контроллера не должно быть никаких публичных методов вообще, он должен сам создать лист (если требуется), отдать ему модель, сам подписаться на его события и менять модель. |
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
Это значит, что в программе взаимодействия листа и его внешнего управляющего элемента selectedItem вообще не должно находиться в модели. Взаимодействие элементов происходит только на уровне контроллера.
Пример - взаимодействие двух листов: выбираешь во втором => должно выбираться в первом и наоборот. модель: private var _someData:XML = new XML(...); public function get someData():XML { return someData; } 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; } Правильно я понимаю? |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Нет, неправильно. Хотя бы потому что у разных моделей ни один узел в одном XML не равен другому узлу из другого XML. Соответственно хендлеры работать не будут. Необходимо использовать либо selectedIndex (что обычно проще), либо находить по какому-то критерию от узла одного XML другой узел другого XML и ставить его в качестве selectedItem у второго листа. Безусловно, этим занимается контроллер.
|
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
Все ясно, спасибо!
|
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
__etc, очень извиняюсь но у меня опять назрел вопрос из той же серии. Все никак не могу понять...
1) А как быть с текстовыми полями? Например, контроллер - текстовое инпут-поле, рядом с ним кнопка. По нажатию на кнопку в модели апдейтится поле text, туда посылается переменная text из текстового поля. Но это же поле модели может изменить кто-либо другой => контроллер слушает события модели на предмет апдейта этого поля text. По нажатию на кнопку я делаю апдейт модели. Модель испускает событие об изменении поля text внутри себя. Из-за этого события вызывается функция контроллера, которая апдейтит текстовое поле. Но оно уже изменилось до этого средствами флэша => эта функция вызвалась вхолостую. 2) А может ли контроллер быть наследником визуального класса, например Sprite? Ведь чтобы расположить вьюверы на экране, нужны какие-то данные (хотя бы stage). Или width, height для того, чтобы расположить вьюверы каким-то определенным образом. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
1) Это каким образом изменение модели прошло в обход контроллера? Контроллер, если и слушает изменение модели, то только лишь те изменения, которые требуют добавления/удаления вьюверов. В противном случае, изменения отслеживаются исключительно вьюверами. Ну а если подходить к возможным замкнутым рекурсиям, то в любом случае (в любом, это важно), в сеттере должна стоять проверка на текущее значение, типа if (this._somevalue === value) return;.
2) Он может иметь ссылку на контейнер-вьювер, но сам по себе визуальным объектом не может быть ни при каких обстоятельствах. |
|
|||||
|
стервочка (я мужик)
|
__etc, ну зачем категорично? это комбо-система ... пример: любой уиконтрол
![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 08:31. |
|
|
« Предыдущая тема | Следующая тема » |
|
|