Просмотр полной версии : Как к переменной подписать слушателя?
Как к переменной подписать слушателя?
Чтоб при ее изменении в зависимости от значения выполнялась нужная мне функция.
Т.е изменилась переменная и сразу срабатывает событие и выполняется соответствующий код...
Подскажите где копать или лучше пример наглядный с комментами.
Смотрел что есть нечто подобное в Хелпе - зовется watch(), но ничего так и не понял.
Создаеш обьект. В нем задаеш параметр например obj.n = 0.
Вешаеш на него watch, obj.watch('n', func, 0); - 'n' - Строка, име обьекта на каторый повешан ватч. func - Функция каторая вызывается при изменении. 0 просто значение каторое ты задаеш func будет вызыватся каждый раз с этим значением в качестве аргумента.
Пишеш функцию function func(arg1, arg2, arg3, arg4){};
- arg1 будет n
- arg2 будет предидуше значение obj.n
- arg3 будет новое значение obj.n
- arg4 третий аргумент из watch
marat_sa
08.09.2008, 14:20
Делай вызов функции в том месте кода, где изменяешь переменную...
to marat_sa:
Не всегда удобно вызывать функцию где изменяется переменная...
Например есть модальное окно, в зависимости от возвращаемого результата мне нужно вызвать определенную функцию, как дождаться изменения переменной и в том же месте вызвать нужную функцию?
to qazwsx:
Спасибо, уже немного понятней...
Вот только еще момент
- arg1 будет n и - arg3 будет новое значение obj.n т.е они равны?
зачем два одинаковых параметра? или arg1 это имя переменной?
chingachgoog
08.09.2008, 15:10
неужели так трудно прочитать про watch в русском хелпе?
неужели так трудно прочитать про watch в русском хелпе?
Не понимаю я таких ответов....
Если нечего добавить по теме, то лучше вообще ничего не писАть!
Вопрос же не ставился конкретно по watch...
это как возможный вариант, и спасибо qazwsx что доступно разжевал именно этот метод...
Может вообще на форуме создать правило - типа "то что есть в хелпе и Гугле даже не пытаться спрашивать - иначе растрел!"
chingachgoog
08.09.2008, 17:19
А про callback кто спрашивал?
- arg1 будет n и - arg3 будет новое значение obj.n т.е они равны?
зачем два одинаковых параметра? или arg1 это имя переменной?
Ответа нет в хелпе что-ли? Или ответ qazwsx более подробный, чем в хелпе? :)
to chingachgoog:
при всем уважении, но спрашивал то я не у Вас... :)
или Вы в секретарях числитесь у qazwsx?... в следующий раз буду знать, чтоб к нему обратиться я это через Вас буду делать.
Если кроме watch больше способов нет отследить изменение переменной,
то всем спасибо, уже разобрался - вопрос можно считать закрытым.
chingachgoog
08.09.2008, 18:25
Mur4ik, извините, я вовсе не думал вас не только поучать, но и даже вообще как-то осуждать. Мой вопрос был более исследовательский: в данном вопросе русский хелп настолько запутан?
Жень Шень
08.09.2008, 18:42
Привет!
Тоже как-то давно разбирался с watch.
Вот выдержка из хэлпа: "Метод; регистрирует обработчик события, вызываемый в случае, когда свойство объекта изменяется"
В приведеном коде в последней строке значение просто переприсвоино, но watch срабатывает.
var myObject:Object = new Object();
myObject.speed = 0;
var speedWatcher:Function = function (prop, oldVal, newVal, speedLimit) {
if (newVal>speedLimit) {
trace("Вы превышаете.");
} else {
trace("Вы не превышаете.");
}
return newVal;
};
myObject.watch("speed", speedWatcher, 55);
myObject.speed = 54;
myObject.speed = 57;
myObject.speed = 57;
Вышесказанное написано на правах размышления.
to chingachgoog:
извинения не принимаются :), т.к не за что тут извиняться
к русскому хелпу я все же обратился, спасибо
to Жень Шень:
спасибо, хелп я уже изучил по вопросу watch
P.S. Я так понял что в данном методе немаловажно вернуть функцией callback значение отслеживаемой переменной иначе ей присвоится значение "undefined".
Всем спасибо...
Жень Шень
08.09.2008, 19:55
to Mur4ik
Нет, я не в смысле "подсказать", а как бы продолжить ваш разговор про watch.
Ситация: какой-нить объект отработал свой код и вернул значение. А оно оказалось равным прежнему. А watch все равно срабатывает! То есть надо еще сверить с предыдущим значением, чтоб не вызывать функцию вхолостую.
Но, сдругой стороны этот, скажем казус, оказался мне на руку, когда надо было запускать функции из внешней оболочки - я просто переприсваивал переменной тоже значения и watch делал свое дело!
Спасибо, учту...
Так этот wanch срабатывает всякий раз при изменении переменной или все таки при присваивании ей какого либо значения...
в Хелпе написано:
"callback Функция, вызываемая, когда отслеживаемое свойство изменяется.", т.е как в данном случае понимать слово "изменяется"?
Как вариант, если просто для переменной, - написать свой getter-setter.
Я не сразу понял что такое watch, пока не сделал так
var BoolWatcher:Function = function (prop, oldVal, newVal) {
if (newVal) {
trace("включили");
} else if (!newVal) {
trace("выключили");
}
return newVal;
};
var test:Boolean = true
watch("test", BoolWatcher);
test = true
test = false
Именно это мне нужно было
Жень Шень
20.11.2008, 12:40
Привет!
А мне кажется, что правильней писать так:
var myObject:Object = new Object();
myObject.test = true;
var BoolWatcher:Function = function (prop, oldVal, newVal) {
if (newVal) {
trace("включили");
} else if (!newVal) {
trace("выключили");
}
return newVal;
};
myObject.watch("test", BoolWatcher);
myObject.test = true;
myObject.test = false;
myObject.unwatch("test");
myObject.test = true;
myObject.test = false;
Аргументирую:
1. watch - метод объекта. А у вас не понятно к какому объекту он относится. Отсюда:
2. Метод не подсвечивается при написании (возможно это для вас несущественно), а значит не проверяется синтаксис АС. И:
3. У вас не будет работать метод unwatch. А он может быть полезен, если надо прекратить отслеживание
chingachgoog
20.11.2008, 13:16
1. watch - метод объекта. А у вас не понятно к какому объекту он относится.
...
3. У вас не будет работать метод unwatch. А он может быть полезен, если надо прекратить отслеживание
Почему не понятно? Компилятор подставляет this автоматом. Потому можно и unwatch без проблем вызвать.
вроде никто про методы get/set не упоминал
class Team {
var teamName:String;
var teamCode:String;
var teamPlayers:Array = new Array();
function Team(param_name:String, param_code:String) {
this.teamName = param_name;
this.teamCode = param_code;
}
function get name():String {
return this.teamName;
}
function set name(param_name:String):Void {
this.teamName = param_name;
}
}
вроде никто про методы get/set не упоминал
А если поднять глаза выше на несколько постов?
Жень Шень
20.11.2008, 16:54
Потому можно и unwatch без проблем вызвать.
Так не вызывается:
test = true;
test = false;
unwatch("test")
test = true;
test = false;
// трейс:
включили
выключили
включили
выключили
C this работает.
Но, помоему, в большом коде и с несколькими watch можно запутаться.
Короче, на любителя... все это...
chingachgoog
20.11.2008, 17:01
Так не вызывается:
test = true;
test = false;
unwatch("test")
test = true;
test = false;
// трейс:
включили
выключили
Это как раз и значит, что сработал unwatch - иначе было бы:
включили
выключили
включили
выключили
:)
faust.d503
20.11.2008, 18:52
А не проще сделать класс, для программы и для переменной написать сеттер метод и через него запускать нужную функцию?
Жень Шень
20.11.2008, 18:53
2 faust.d503
watch прекрасно справляется с задачей. Повторюсь только в том, что он срабатывает не только при изменении переменной, но и при простом переприсвоении.
chingachgoog
20.11.2008, 19:07
Не знаю, у меня без разницы с this или без:
BoolWatcher = function (prop, oldVal, newVal) {
if (newVal) {
trace("включили");
} else if (!newVal) {
trace("выключили");
}
return newVal;
};
test = true
watch("test", BoolWatcher);
test = true
test = false
unwatch ("test") // потом закоментируем эту строчку
test = true
test = false
трейсит:
включили
выключили
и если закоментировать unwatch ("test"), то трейсит:
включили
выключили
включили
выключили
Можно добавлять/убирать this в любых комбинациях - ничего не меняеется:
watch("test", BoolWatcher)
...
unwatch ("test")
или
this.watch("test", BoolWatcher)
...
unwatch ("test")
или
watch("test", BoolWatcher)
...
this.unwatch ("test")
или
this.watch("test", BoolWatcher)
...
this.unwatch ("test")
Жень Шень
20.11.2008, 19:16
chingachgoog, ссори!
Была ошибка у меня в коде ... в буквочке. Не доглядел.
Действительно по барабану с "дзыс" или без него...
Но, для чего Адобэ сделала атоматическое добавление this, мне не понятно :(
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.