PDA

Просмотр полной версии : listener на переменую


4teras
25.07.2007, 16:01
помогите плз написать 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
та вообще если так сделать _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
тут мне предложили такой вариант
...
только тут опять получились проблемы из за глобала
Какие проблемы? На сам объект _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;
}
что еще-то нужно?