Форум 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=126337)

loover 16.06.2009 23:17

как постоянно отслеживать изменение значения переменной в другом классе?
 
как постоянно отслеживать изменение значения переменной в другом классе?

bugizavr 16.06.2009 23:42

читай про get, set методы
а также про диспетчеризацию событий

loover 16.06.2009 23:52

читал. пока не очень получается. у меня в одном классе есть public static var s:String, которая в определенный момент времени изменяет значение. во втором - private var _msg:String.

во втором классе пишу:
Код AS3:

private function get msg():String
{
        return _msg;
}               
private function set msg(val:String):void
{
        _msg = FirstClass.s;
}

а вот как это использовать?

bugizavr 17.06.2009 00:01

если грубо))

в первом классе должен объявить константу
S_CHANGED:String = "SChanged";

и при изменении s в ПЕРВОМ КЛАССЕ
должен писать

dispatchEvent(new Event(S_CHANGED));

а второй класс должен подписать на это событие
и в лисенере
_msg = e.currentTarget.s;

loover 17.06.2009 00:25

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

bugizavr 17.06.2009 00:33

ну делаешь во втором классе объявление ЭС с таким именем _s

и в нём же пишешь

private function set s(val:String):void
{
_s = val;
dispatchEvent(new Event(S_CHANGED));
}

silin 17.06.2009 00:46

для статического свойства функцию вещания придется переложить на статический же диспатчер:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Test extends Sprite
        {
                public function Test():void
                {
                        //подписываемся
                        Class1.addEventListener(Event.CHANGE, watchS);
                        //меняем/смотрим трейс
                        Class1.s = "value";
                        Class1.s = "new value";
                }
 
                private function watchS(evnt:Event):void
                {
                        trace("Class1.s changed to " + Class1.s);
                }
 
        }
 
}

Код AS3:

package  
{
        import flash.events.*;
 
        public class Class1
        {
                private static var _s:String="";
                private static var _dispatcher:EventDispatcher = new EventDispatcher();
 
 
                static public function addEventListener (type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void
                {
                        _dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
                }
 
                static public function get s():String { return _s; }
                static public function set s(value:String):void
                {
                        if (_s == value) return;
                        _s = value;
                        _dispatcher.dispatchEvent(new Event(Event.CHANGE));
                }
        }
}

upd: добавил проверку (_s == value), чтоб не слать холостых событий

loover 17.06.2009 00:49

что такое "ЭС"?

а не проще ли при отрицательном ответе просто запускать таймер, который будет запускать функцию с проверкой до получения нужного результата. и обойтись без геттера/сеттера. или это нубский подход?

ramshteks 17.06.2009 00:58

Цитата:

Сообщение от loover (Сообщение 828588)
что такое "ЭС"?

а не проще ли при отрицательном ответе просто запускать таймер, который будет запускать функцию с проверкой до получения нужного результата. и обойтись без геттера/сеттера. или это нубский подход?

make me unsee it...
даже нубы думаю должны понимать что это не подход впринципе, когда есть перкрасный способ реализовать то, что вам нужно через события.

silin 17.06.2009 00:59

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


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

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