Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как к переменной подписать слушателя? (http://www.flasher.ru/forum/showthread.php?t=115705)

Mur4ik 08.09.2008 13:58

Как к переменной подписать слушателя?
 
Как к переменной подписать слушателя?
Чтоб при ее изменении в зависимости от значения выполнялась нужная мне функция.
Т.е изменилась переменная и сразу срабатывает событие и выполняется соответствующий код...
Подскажите где копать или лучше пример наглядный с комментами.
Смотрел что есть нечто подобное в Хелпе - зовется watch(), но ничего так и не понял.

qazwsx 08.09.2008 14:19

Создаеш обьект. В нем задаеш параметр например 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

Делай вызов функции в том месте кода, где изменяешь переменную...

Mur4ik 08.09.2008 14:34

to marat_sa:
Не всегда удобно вызывать функцию где изменяется переменная...
Например есть модальное окно, в зависимости от возвращаемого результата мне нужно вызвать определенную функцию, как дождаться изменения переменной и в том же месте вызвать нужную функцию?

to qazwsx:
Спасибо, уже немного понятней...
Вот только еще момент
- arg1 будет n и - arg3 будет новое значение obj.n т.е они равны?
зачем два одинаковых параметра? или arg1 это имя переменной?

chingachgoog 08.09.2008 15:10

неужели так трудно прочитать про watch в русском хелпе?

Mur4ik 08.09.2008 16:06

Цитата:

Сообщение от chingachgoog (Сообщение 762991)
неужели так трудно прочитать про watch в русском хелпе?

Не понимаю я таких ответов....
Если нечего добавить по теме, то лучше вообще ничего не писАть!

Вопрос же не ставился конкретно по watch...
это как возможный вариант, и спасибо qazwsx что доступно разжевал именно этот метод...

Может вообще на форуме создать правило - типа "то что есть в хелпе и Гугле даже не пытаться спрашивать - иначе растрел!"

chingachgoog 08.09.2008 17:19

А про callback кто спрашивал?

Цитата:

Сообщение от Mur4ik (Сообщение 762984)
- arg1 будет n и - arg3 будет новое значение obj.n т.е они равны?
зачем два одинаковых параметра? или arg1 это имя переменной?

Ответа нет в хелпе что-ли? Или ответ qazwsx более подробный, чем в хелпе? :)

Mur4ik 08.09.2008 17:46

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;

Вышесказанное написано на правах размышления.

Mur4ik 08.09.2008 19:17

to chingachgoog:
извинения не принимаются :), т.к не за что тут извиняться
к русскому хелпу я все же обратился, спасибо

to Жень Шень:
спасибо, хелп я уже изучил по вопросу watch

P.S. Я так понял что в данном методе немаловажно вернуть функцией callback значение отслеживаемой переменной иначе ей присвоится значение "undefined".

Всем спасибо...

Жень Шень 08.09.2008 19:55

to Mur4ik
Нет, я не в смысле "подсказать", а как бы продолжить ваш разговор про watch.
Ситация: какой-нить объект отработал свой код и вернул значение. А оно оказалось равным прежнему. А watch все равно срабатывает! То есть надо еще сверить с предыдущим значением, чтоб не вызывать функцию вхолостую.
Но, сдругой стороны этот, скажем казус, оказался мне на руку, когда надо было запускать функции из внешней оболочки - я просто переприсваивал переменной тоже значения и watch делал свое дело!

Mur4ik 08.09.2008 21:49

Спасибо, учту...
Так этот wanch срабатывает всякий раз при изменении переменной или все таки при присваивании ей какого либо значения...
в Хелпе написано:
"callback Функция, вызываемая, когда отслеживаемое свойство изменяется.", т.е как в данном случае понимать слово "изменяется"?

_Alex 16.10.2008 14:59

Как вариант, если просто для переменной, - написать свой getter-setter.

xdoom 19.11.2008 11:24

Я не сразу понял что такое watch, пока не сделал так

Код AS1/AS2:

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

Привет!
А мне кажется, что правильней писать так:
Код AS1/AS2:

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

Цитата:

Сообщение от Жень Шень (Сообщение 778396)
1. watch - метод объекта. А у вас не понятно к какому объекту он относится.
...
3. У вас не будет работать метод unwatch. А он может быть полезен, если надо прекратить отслеживание

Почему не понятно? Компилятор подставляет this автоматом. Потому можно и unwatch без проблем вызвать.

H!t 20.11.2008 13:25

вроде никто про методы get/set не упоминал

Код AS1/AS2:

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;
 }
}


etc 20.11.2008 13:36

Цитата:

Сообщение от H!t (Сообщение 778429)
вроде никто про методы get/set не упоминал

А если поднять глаза выше на несколько постов?

Жень Шень 20.11.2008 16:54

Цитата:

Сообщение от chingachgoog (Сообщение 778421)
Потому можно и unwatch без проблем вызвать.

Так не вызывается:
Код:

test = true;
test = false;
unwatch("test")
test = true;
test = false;
// трейс:
включили
выключили
включили
выключили

C this работает.
Но, помоему, в большом коде и с несколькими watch можно запутаться.
Короче, на любителя... все это...

chingachgoog 20.11.2008 17:01

Цитата:

Сообщение от Жень Шень (Сообщение 778543)
Так не вызывается:
Код:

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, мне не понятно :(


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

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