Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Подписка вложенных моделей (http://www.flasher.ru/forum/showthread.php?t=146514)

s8000_1 10.11.2010 11:22

Подписка вложенных моделей
 
Допустим, вьювер должен реагировать на изменение 3х моделей, которые находятся непонятно где, например:

Код AS3:

AppGlobal.model.resources.model1
AppGlobal.model.playground.user.item.model2
AppGlobal.model.model3

Чтобы подписать что-то на измения, надо для начала подписать родительскую модель на событие создания. А если уровней вложенности несколько, то всех родителей.
Для решения этой задачи вытащил из flex ChangeWatcher, но у него есть минус - при изменении имени какого-либо свойства из цепочки, он перестает работать, не ругаясь при этом.

Код AS3:

BindingUtils.bindSetter(this._setModel1, AppGlobal.model, ["resources","model1"], false,true);
BindingUtils.bindSetter(this._setModel2, AppGlobal.model, ["playground","user","item","model2"], false,true);
BindingUtils.bindSetter(this._setModel3, AppGlobal.model, ["model3"], false,true);


Как вы решаете в целом проблему подписки на события таких моделей?

alatar 10.11.2010 11:57

Передайте view ссылки на модели, пусть подпишется.

s8000_1 10.11.2010 12:44

alatar, так не известно, создались ли модели или нет. Если бы была гарантия 100% существования нужного свойства нужной модели, то проблемы бы не возникало. Их создают другие контроллеры, никак с этим вьювером не связанные.

dimarik 10.11.2010 12:55

Подписываю представление(я) на события создания дочерних моделей в родительских моделях. Можно подписаться к общему узлу, имеющим в своих ветках нужных родителей. Событие добавления/удаления доставляется к этому узлу баблингом.

alatar 10.11.2010 12:59

Цитата:

Если бы была гарантия 100% существования нужного свойства нужной модели, то проблемы бы не возникало.
Можно и не знать о существовании свойсв у модели. Вам ведь нужны только изменения? Ну так пошлите событие, что свойство n изменило свое значение с x на y. Модели можно передавать как базовый класс или интерфейс, у которого есть только нужное событие.

s8000_1 10.11.2010 14:28

dimarik, а как баблинг реализуете в моделях? Своя событийная модель?
Если подписывать все на создание всего, особенно при сильных уровнях вложенности, можно здорово запутаться.

alatar, (что тут писать, если нечего подписывать?).addEventListener(...)
И в какой момент подписывать.

alatar 10.11.2010 15:08

Цитата:

И в какой момент подписывать.
В момент добавления модели к view.
Цитата:

что тут писать, если нечего подписывать?
Когда модели у вас создаются, приложение об этом как-то узнает? Или они у вас как партизаны, тихо организовались и в лес ушли?

s8000_1 10.11.2010 21:58

alatar, я уже написал выше. Если всех родителей модели проверять на созданность, делая обработчики всех созданий, то можно получить такую нехилую структуру, что лучше подумать над другими реализациями. Это при глубоких уровнях вложенности.

alatar 10.11.2010 22:40

Зачем обработчики? какая структура? Одна строчка, что бы подписаться на событие и одна функция, которая отдиспатчит его выше это уже нехилая структура?
Видимо я не до конца понимаю вашу проблему.

dimarik 10.11.2010 22:59

Цитата:

Сообщение от s8000_1 (Сообщение 948802)
dimarik, а как баблинг реализуете в моделях? Своя событийная модель?

Да, своя реализация, с помощью EventDispatcher'а. Почти своя, если учесть что DOM адоб реализовал только для дисплей-листа. Мой велосипед - конгломерат модернизации идей BloodHound'а и исследования поведения нативного EventDispatcher. Эта штука просто реализует GoF паттерн Composite. Хочу разродится в скором времени статейкой в своем бложике по этому поводу.


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

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