Форум 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)
-   -   listener на переменую (http://www.flasher.ru/forum/showthread.php?t=98965)

4teras 25.07.2007 16:01

listener на переменую
 
помогите плз написать listener который бы выполнял некоторую функцию когда изменяется переменная _global.tmp
я нашел такую функцию .onChanged = function(){...} но у меня не получается. помогите плз

CrazyFlasher 25.07.2007 16:10

ну по-корявому можно так =))
Код:

_global.tmp = 123;
tempVar = _global.tmp;

this.onEnterFrame = function(){
        if(_global.tmp != tempVar){
                trace("variable has new value!");
        }
}

хотя не...чё-то отморозил =) сотрите этот пост и не читайте его! =))

etc 25.07.2007 16:11

watch, addProperty…

4teras 25.07.2007 16:17

так это же не лиснер.
__etc: можешь плз подробнее написать

Wolsh 25.07.2007 16:23

это метод текстфилда. А тебе наверно придется делать интервал и проверять каждую миллисекунду :) равно ли значение переменной предыдущему. Опыт (мой, конечно) показывает, что проще заделать какое-нибудь действие там, где она изменяется. Чтоб процессор не дымился :)

4teras 25.07.2007 16:24

насколько я понял watch, addProperty можно применять только к Object.
а как тогда свойством сделать переменную _global.tmp ?

Wolsh 25.07.2007 16:25

О, да, __etc, расскажи про watch

4teras 25.07.2007 16:27

Wolsh: ну такой метод постоянной проверки не очень симпатичен. а дело в том что у меня переменная может изменятся с нескольких подгружаемых мувиков, и для каждого писать действие которое надо делать просто выше моих сил

screamge 25.07.2007 16:39

Код:

_global = new Object ();
_global.speed = 0

var speedWatcher:Function = function(prop, oldVal, newVal) {
        trace (newVal);
    return newVal;
}

_global.watch("speed", speedWatcher);

_global.speed = 54;
_global.speed = 57;

Вот так работает, решение на самом деле простое, не использовать глобал, ведь рут переменные тоже доступны отовсюду.
С подгружающимися мувиками работать не будет, досягаемость только в области текущего таймлайна.

4teras 25.07.2007 16:42

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

4teras 25.07.2007 16:42

спасибо за ответ. буду пробовать!!!

Wolsh 25.07.2007 16:58

Да тут любой объект делаешь, я не понял зачем товарищ screamge назвал его _global, очевидно чтобы всех запутать :)

4teras 25.07.2007 17:03

слушайте! это ж не лисенер. если мы делаем вот так _global = new Object ();
то у нас уже с этого места ни одна глобальная переменная не прочитается больше!!!!
А разве лисенером нельзя смотреть за переменными?

screamge 25.07.2007 17:04

Если в самом начале объявлена глобал переменная _global.tmp = 123 то дописываем _global = new Object (), по своей сути global это не объяект из этих соображений watch с ним не работает.

Лисенерами можно слушать, а слушать нужно события. Следить за значениями лисенер не обязан, решение а вам посоветовал в своём первом посте.

Собственно:
Код:

_root.speed = 0

var speedWatcher:Function = function(prop, oldVal, newVal) {
        trace (newVal);
    return newVal;
}

_root.watch("speed", speedWatcher);

_root.speed = 54;
_root.speed = 57;

В таком случае слежение за объектом доступно отовсюду и глобал если он вам ещё понадобится тоже цел.


В продолжении темы слушателей, есть такая штука как dispatchEvent и вообще в таком случае почитайте про событийную модель во флеш.

Kikasso 25.07.2007 17:06

Создай глобальный объект, в него и пихай все переменные. Так примерно:
Код:

_global.RULEZ = {}
function getVal(){
        return this.__val;
        };
function setVal(val){
        trace(this + ': ' + arguments);
        this.__val = val;
        }
function propMan( p,o,n){
        trace(this + ': ' + arguments);
        return n;
}
trace ( RULEZ.addProperty('val', getVal, setVal ) );
trace ( RULEZ.watch( 'prop', propMan ) );

var i = 5;
var id:Number;
function testIt(){
        if(--i < 1) clearInterval(id);
RULEZ.val = 'gVal ' + i;
RULEZ.prop = 'gProp ' + i;
}
id = setInterval( testIt, 1000 );
trace('-----------------');

А на сам _global геттер не подвесишь.

4teras 25.07.2007 17:08

та вообще если так сделать _global = new Object () написать в самом начале, то переменные вообще сума сходят и ничего не работает!

Kikasso 25.07.2007 17:09

Цитата:

Сообщение от 4teras
та вообще если так сделать _global = new Object () написать в самом начале, то переменные вообще сума сходят и ничего не работает!

Никогда так не делайте.

Wolsh 25.07.2007 17:17

Вот именно. Создай любой объект и его свойством - переменную, за которой будешь следить, и всех делов. Объект просто придумай куда поместить чтоб легко достучаться можно было. А то _global... ишь, на святое позарились!

screamge 25.07.2007 17:19

Про глобал объект как-то не подуал, стыдно :(

4teras 25.07.2007 18:25

тут мне предложили такой вариант

Код:

this.watch("temp",watchF);
function watchF(prop,ov,nv){
//call your function
return nv;
}

только тут опять получились проблемы из за глобала

Kikasso 25.07.2007 19:45

Цитата:

Сообщение от 4teras
тут мне предложили такой вариант
...
только тут опять получились проблемы из за глобала

Какие проблемы? На сам объект _global ничего не повесишь, но на глобальный объект - запросто, и виден он будет отовсюду.

Wolsh 26.07.2007 10:06

Ну вот же работает
Код:

_reno = new Object ();
_reno.speed = 0

var speedWatcher:Function = function(prop, oldVal, newVal) {
    trace (newVal);
    trace('Есть!');
    return newVal;
}

_reno.watch("speed", speedWatcher);
//проверяем
_reno.speed = 57;
//и еще раз через три секунды
_global.setTimeout(_root,'figa',3000);

function figa() {
        _reno.speed = 59;
}

что еще-то нужно?


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

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