AS2: загружать переменные класса с помощью sendandload

Я использую Actionscript 2.0 в сочетании с PHP, теперь я могу позвонить в свой файл PHP и получить данные, но, видимо, мне нужно использовать эти данные немедленно, я не могу использовать их для заполнения переменных своего класса.

Это то, что я хочу:

class user {

var lastname:String;

function user(in_ID:Number){
        var ontvang:LoadVars = new LoadVars();
        var zend:LoadVars = new LoadVars();
        zend.ID = in_ID;
        zend.sendAndLoad("http://localhost/Services/getUser.php", ontvang, "POST");
        ontvang.onLoad = function(success:Boolean) {
            if (success) {
                lastname = ontvang.lastname;
            } else {
                lastname = 'error';
            }
        };
}
}

Я обнаружил, что это большая проблема в AS2, я нашел этот пост, чтобы обойти это, если вы загружаете данные XML, но я не могу заставить его работать с LoadVars: http://www.actionscript.org/forums/showthread.php3?t=144046

Любая помощь будет оценена.


person Pmarcoen    schedule 15.06.2009    source источник


Ответы (1)


Когда вызывается ваш обработчик onLoad, он вызывается так, как если бы он был функцией-членом экземпляра LoadVars, а не вашего пользовательского экземпляра.

Есть несколько способов обойти это, один из них — использовать Delegate.create(), чтобы создать функцию, которая будет работать как задумано, например:

import mx.utils.Delegate;

class user {

    var lastname:String;
    var ontvang:LoadVars;

    function user(in_ID:Number){
                ontvang = new LoadVars();
                var zend:LoadVars = new LoadVars();
                zend.ID = in_ID;
                ontvang.onLoad = Delegate.create(this, onLoad);                
                zend.sendAndLoad("http://localhost/Services/getUser.php", ontvang, "POST");

                };
    }

    function onLoad(success:Boolean) : Void
    {
       if (success) {
          lastname = ontvang.lastname;
       } else {
          lastname = 'error';
       }
    }
}

Не забывайте, что загрузка является асинхронной — когда вы создаете один из своих пользовательских объектов, переменные-члены не будут доступны сразу. Что вам может понадобиться, так это позволить вашему пользовательскому объекту сигнализировать о своей готовности так же, как это делает LoadVars (например, с функцией обратного вызова, предоставляемой вызывающей стороной), чтобы ваше приложение управлялось этими асинхронными событиями.

person Paul Dixon    schedule 15.06.2009
comment
Хорошо, 2 вещи: 1. Где я могу найти класс Delegate? 2. В функции onLoad теперь вызывается ontvang.lastname, но внутри функции onLoad нет переменной ontvang.. Уже спасибо! - person Pmarcoen; 15.06.2009
comment
Хорошо, видимо, мне просто нужно было добавить import mx.utils.Delegate; Я попытался использовать this.lastname вместо ontvang.lastname Теперь в моем основном файле есть var u = new user(1); текст.текст = u.getLastname(); Но я все еще получаю «неопределенный» в своем текстовом поле. - person Pmarcoen; 15.06.2009
comment
Извините - поправил. ontvang должен быть членом класса, чтобы вы могли подобрать его во время onLoad. - person Paul Dixon; 15.06.2009