Просмотр полной версии : Как отследить изменение переменной внутри класса
Есть мувиклип с описанием класса:
#initclip
TGrid.prototype = new MovieClip();
function TGrid() {
trace("constructor");
}
TGrid.prototype.recordSet = [];
TGrid.prototype.Draw = function() {
trace(this.recordSet);
}
#endinitclip
Теперь приаттачиваю его на основную сцену:
this.attachMovie("TGrid", "Grid", 1);
var recordSet = [];
recordSet[0] = 0;
recordSet[1] = 1;
Grid.recordSet = recordSet;
и хочу, чтобы после присвоения Grid.recordSet нового значения сразу вызвалась внутрення функция Grid.Draw().
Подсажите, пожалуйста, как внутри класса прописать что-то типа
TGrid.watch("recordSet", this.Draw);
Или мне нужно заводиться с механизмом создания собственного события типа:
TGrid.prototype.onEnterFrame = fucntion()
{
if (this.recordSet.length > 0) this.Draw();
}
ну и т.д. по тексту?
Merci beaucoup!
Напиши функцию-сеттер для присвоения Grid.recordSet нового значения и вызывай в ней Draw().
Если вроде этого
TGrid.prototype.SetRecordSet = function(recordSet)
{
this.recordSet = recordSet;
this.Draw();
}
а потом
Grid1.SetRecordSet(recordSet);
- то не очень бы хотелось.
По-моему, как-то коряво получается.
См. help на Object.addProperty
Спасибо. Посмотрел. Что-то в этом есть. Пойду попробую приделать ЭТО к классу :) .
Не знаю, но почему-то не работает.
Сделал так
#initclip
TGrid.prototype = new MovieClip();
function TGrid() {
trace("constructor");
}
TGrid.prototype.addProperty("recordSet", null, TGrid.prototype.SetRecordSet);
TGrid.prototype.SetRecordSet = function(rs)
{
this.recordSet = rs;
this.Draw();
}
TGrid.prototype.Draw = function() {
trace(this.recordSet);
}
#endinitclip
А в первом кадре так:
this.attachMovie("TGrid", "Grid", 1);
var recordSet = [];
recordSet[0] = 0;
recordSet[1] = 1;
Grid.recordSet = recordSet;
....и ничего... :(
Чувствую, что пока знаний не хватает, прийдется Grid.Draw() вручную вызывать :p
Переходи на actionscript 2.0
class cSomeClass{
private var somepropety:Number=10;
function cSomeClass(){}
function set somepropety(value:Number):Void{
somepropety=value;
someFunction();
}
function someFunction():Void{
trace("someFunction");
}
}
item=new cSomeClass();
item.somepropety=value;
Все красиво
Nox Noctis
29.07.2004, 16:42
не обязательно под семёрку переделывать.
просто глупостей писать не надо :)
Lego, объясни пожалуйста, почему ты СНАЧАЛА создаёшь прототип функции, а только потом создаёшь саму функцию? :)) это во-первых.
во-вторых - почему ты СНАЧАЛА создаёшь сеттер, передаёшь ему сетовую функцию, а только потом эту сетовую функцию создаёшь? :) что за чудеса? :)
в-третих:
всегда можно протрейсить результат выполнения функции addProperty. если возвратилось false - то выполнения сеттера ждать бесполезно: свойство просто не было создано.
а не создаётся оно потому, что ты передаёшь ему сеттер, но не передаёшь геттер :)) read only свойства я еще видел, а вот write only - это что-то дзен-буддистское :))
и в-самых-последних:
зачем вся эта заморочка с классом и инитклипом, если ты не регистрируешь класс при помощи Object.registerClass?
итого:
#initclip
function TGrid() {
trace("constructor");
}
TGrid.prototype = new MovieClip();
TGrid.prototype.SetRecordSet = function(rs) {
this.recordSet = rs;
trace("recordSet changed!");
};
TGrid.prototype.GetRecordSet = function() {
return this.recordSet;
};
TGrid.prototype.addProperty("recordSet", TGrid.prototype.GetRecordSet, TGrid.prototype.SetRecordSet);
//
Object.registerClass("TGrid", TGrid);
#endinitclip
По поводу первого - в целом, согласен, но не вижу принципиальной ошибки - ведь работает в обоих случаях.
По поводу второго - я же могу, допустим, написать так
f = pi_2();
function pi_2()
{
return Math.Pi()/2;
}
? Ведь работает.
Третье, пропущу - лопухнулся.
А про последнее ВООБЩЕ не понял. Но все равно спасибо.
Nox Noctis
29.07.2004, 17:07
Оригинал написал(а) Lego
По поводу первого - в целом, согласен, но не вижу принципиальной ошибки - ведь работает в обоих случаях.вобщем-то да :) я забыл упомянуть одну фишку...
это связано со следующим вопросом:
Оригинал написал(а) Lego
По поводу второго - я же могу, допустим, написать так
f = pi_2();
function pi_2()
{
return Math.Pi()/2;
}
? Ведь работает.
это потому что ты, может быть, никогда не декомпилировал ролики :) или декомпилировал, но не обращал внимания. если ты создаёшь функцию так:
function name (args) {
..
}
то её объявление перемещается при компиляции на самый верх. как будто ты написал это в первых строчках скрипта. т.е. это происходит даже без твоего ведома.
а вот если ты создаёшь функцию так:
name = function () { .. };
то там где написал объявление - там оно и будет.
только благодаря этой особенности компилятора флэша у тебя что-то работало. но логика-то при этом принципиально не правильная... собственно это меня и восхитило :) всё задом-наперёд :)
а то что оно почему-то работает даже при неправильно логически построенном скрипте - это не показатель. работает - замечательно. но я бы посоветовал писать код сверху вниз и слева направо, а не как-нибудь еще :))
попробуй сначала налить чай, а потом поставить кружку. а потом наоборот. как думаешь и в том и в другом случае получится одинаковый эффект? :))
Оригинал написал(а) Lego
А про последнее ВООБЩЕ не понял. Но все равно спасибо.что не понял? ты не связал свой инстанс с классом. у тебя и не должно было ничего работать, всё правильно. Object.registerClass привязывает класс к конкретному инстансу в библиотеке. собсно ради этого ты всё это и затевал...
вобщем посмотри код который я запостил - он работает как надо.
ВОТ! Наконец-то понял, чем анонимная функция отличается от обычной :D . Это раз.
По поводу последнего - невнимательно прочитал твой ответ(пропустил частичку "не") и в коде, который я привел, просто опустил Object.registerClass()
Спасибо за науку.
Nox Noctis
29.07.2004, 17:30
зачем пост отредактировал? :)) я не со зла же :))
Да в офиссе раздраконили, блин, а потом успокоился,
подумал и решил - чего обижаться?! Радуйся, что учат делу :D
Вот посмотрел и проверил. Порядок операторов типа
TGrid.prototype = new MovieClip();
function TGrid() {
trace("constructor");
}
я и в инете, и в литературе встречал (конкретно - ActionScript Библия пользователя Джой Лотт, Роберт Рейнхардт).
Так что это не я сам такой молодЕц :D
Nox Noctis
29.07.2004, 17:46
да я тоже встречал :) просто это уже настолько стало казаться логичным и правильным, что в каком порядке нужно делать, что увидев обратный порядок я забыл про первопричину :))
если у авторов это есть, и они поясняют почему это работает, тогда ладно. если не объясняют - плохо. это же нелогичное построение скрипта.
у мука, кстати, это дело упоминается.
Нет. Все равно не ясно по поводу
если ты создаёшь функцию так:
function name (args) {
..
}
.
В том же классе, допустим, есть функции, объявленные в следующем порядке:
TGrid.prototype.Init = function()
{
this.Draw();
}
TGrid.prototype.Draw = function()
{
trace("Опа! такі працює!");
}
Все работает :confused:
Nox Noctis
29.07.2004, 18:00
ну так ты же не вызываешь функцию до того как она объявлена!
сначала весь этот код выполняется (а гарантиует это именно #initclip, который выполняется до всего остального кода в кадрах и на клипах), а тоько потом ты вызываешь инит()
попробуй написать так:
test = new TGrid();
test.Draw();
TGrid.prototype.Draw = function()
{
trace("Опа! такі працює!");
}
test.Draw();
- и сработает оно только один раз. после объявления.
Все. Ок. Понял. Протупил. Огромное спасибо. Вопрос исчерпан.
Может я уже устал к концу дня, но там было Подсажите, пожалуйста, как внутри класса прописать что-то типа
TGrid.watch("recordSet", this.Draw); А чем этот вариант то не подходит? Ну только с соблюдением синтаксиса Object.watch ?
Не волнуйся, все уже подходит. Отдыхай :D
Всем большое спасибо!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.