Mootools JSON: результат за пределами метода / области видимости - PullRequest
2 голосов
/ 05 апреля 2011
var image;
var imgProperties = new Class({
    image: new Array(),
    json: function() {
        var url = protocol + "//" + host + pathname + "/myEchoFile.php";
        var jsonRequest = new Request.JSON({
            url: url,
            onSuccess: function(img) {
                this.image[0] = img.name;
                this.image[1] = img.width;
                this.image[2] = img.height;
                alert('img.name=' + this.name); //alerts myImage.jpg
            }
        }).post();
        console.log("this.image[0]=" + this.image[0]); //undefined
        //@fixme
        //this.image is undefined
    }
});

1 Ответ

3 голосов
/ 05 апреля 2011

Запрос не является синхронным.(следовательно, это AJAX) Требуется время, чтобы запустить, завершить и установить значения.

вы должны ссылаться на экземпляр вашего класса из onSuccess и вызывать отдельную функцию, например:

var imgProperties = new Class({

    Implements: [Events,Options],

    initialize: function(options) {
        this.setOptions(options);
    },

    json: function() {
        new Request.JSON({
            url: "//" + host + pathname + "/myEchoFile.php",
            onSuccess: this.imageLoaded.bind(this)
        }).post();
    },
    imageLoaded: function(data) {
        this.image = [data.name, data.width, data.height];
        this.fireEvent("imageLoaded", this.image);
    }
});

также обратите внимание на .bind(this) в функции onSuccess, которая гарантирует вамукажите на экземпляр класса, а не на глобальную область видимости (объект окна?), что вы делали раньше, изменив window.image.

, чтобы он работал с аноном так, как у вас, было бы так:

onSuccess: function(data) {
    this.imageLoaded(data);
}.bind(this)

также заметил, что я запускаю событие с именем imageLoaded, которое вы можете использовать из экземпляра:

new imgProperties({
    onImageLoaded: function(imageArray) {
        // access imageArray 
        // or just access this.image instead!
        // or export it to your global namespace like before
        window.image = this.image;
        // more code that relies on window.image being defined... 
    }
}).json();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...