Программируя на AS2, я иногда прибегал к использованию конструкции watch для отслеживания изменений в данный.
- function speedWatcherfunction(prop, oldVal, newVal) {
- //BODY
- return newVal;
- }
- // Use watch() to register the event handler
- myObject.watch("speed", speedWatcher);
- myObject.speed = 100;
Наряду с механизмом событий, это удобный подход для реализации связки “субъект-наблюдатели” (шаблон Observer). Плюсом было то, что для данных нет необходимости вводить события (типа change) и диспачить их по мере необходимости - поэтому watch был очень удобен.
С переходом к разработке на Flex (AS3), про watch и мониторинг событий можно забыть, так как binding дает возможность динамической связки данных с представлением (правда биндинг построен тоже на событиях).
Приведу пример использования watch конструкции для Flex2:
- private var changeWatcher: ChangeWatcher = null;
- //...
- private function init () : void
- {
- //set watcher to detect change event for user info
- if(ChangeWatcher.canWatch(model, "userInfo")){
- changeWatcher = ChangeWatcher.watch(
- model,
- ["userInfo"],
- onLoadUsersInfo
- );
- }
- //BODY
- }
- //...
- /**
- * Later init (after get user info).
- */
- private function onLoadUsersInfo(event:Event):void
- {
- if(changeWatcher != null){
- changeWatcher.reset(model);
- }
- //BODY
- }
В данном примере watch используется как программный биндинг (ChangeWatcher входит в пакет mx.binding.utils.ChangeWatcher). Т.е. во Flex2 старый добрый watch перерос в биндинг, а точнее в программный биндинг. К плюсам проследнего можно онтенести - невизуальное связывание (без всяких {} в mxml), возможность установки связки там, где это действительно становится нужным, управление биндингом (как в данном примере - можно отключить).
P.S. Справедливости ради скажу, что в Flash8 тоже был биндинг, но не столь универсальный и удобный как сейчас реализовано во Flex.
К сожалению, с Flex 1/1.5 я знаком только по твоим рассказам и статьям.