PDA

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


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.

во втором классе пишу:
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
для статического свойства функцию вещания придется переложить на статический же диспатчер:
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);
}

}

}

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
что такое "ЭС"?

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

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

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

loover
17.06.2009, 01:46
есть функция, отслеживающая изменение переменной. есть другая функция, в котороя надо проверить значение и, если она не равно null выполнить действие. а вот как их связать? т.е. проверочная ф-ция выполнилась один раз, обломалась, и все? как тут без таймера?

очень хочется разобраться в get/set.

Nirth
17.06.2009, 01:59
Бугагага, это еще смешней людей верящих в говорящих змей. Восьпользуйтесь поиском:P
http://bit.ly/OfdfG
http://bit.ly/mjmdj