Просмотр полной версии : 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: можешь плз подробнее написать
это метод текстфилда. А тебе наверно придется делать интервал и проверять каждую миллисекунду :) равно ли значение переменной предыдущему. Опыт (мой, конечно) показывает, что проще заделать какое-нибудь действие там, где она изменяется. Чтоб процессор не дымился :)
насколько я понял watch, addProperty можно применять только к Object.
а как тогда свойством сделать переменную _global.tmp ?
О, да, __etc, расскажи про watch
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;
Вот так работает, решение на самом деле простое, не использовать глобал, ведь рут переменные тоже доступны отовсюду.
С подгружающимися мувиками работать не будет, досягаемость только в области текущего таймлайна.
но ведь когда создаешь много подгружаемых мувиков не всегда удобно использовать рут
спасибо за ответ. буду пробовать!!!
Да тут любой объект делаешь, я не понял зачем товарищ screamge назвал его _global, очевидно чтобы всех запутать :)
слушайте! это ж не лисенер. если мы делаем вот так _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 и вообще в таком случае почитайте про событийную модель во флеш.
Создай глобальный объект, в него и пихай все переменные. Так примерно:
_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 геттер не подвесишь.
та вообще если так сделать _global = new Object () написать в самом начале, то переменные вообще сума сходят и ничего не работает!
та вообще если так сделать _global = new Object () написать в самом начале, то переменные вообще сума сходят и ничего не работает!
Никогда так не делайте.
Вот именно. Создай любой объект и его свойством - переменную, за которой будешь следить, и всех делов. Объект просто придумай куда поместить чтоб легко достучаться можно было. А то _global... ишь, на святое позарились!
screamge
25.07.2007, 17:19
Про глобал объект как-то не подуал, стыдно :(
тут мне предложили такой вариант
this.watch("temp",watchF);
function watchF(prop,ov,nv){
//call your function
return nv;
}
только тут опять получились проблемы из за глобала
тут мне предложили такой вариант
...
только тут опять получились проблемы из за глобала
Какие проблемы? На сам объект _global ничего не повесишь, но на глобальный объект - запросто, и виден он будет отовсюду.
Ну вот же работает
_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;
}
что еще-то нужно?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.