Mootools JSON:方法/范围之外的结果

时间:2011-04-05 08:39:29

标签: javascript json mootools

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 个答案:

答案 0 :(得分:3)

请求不是同步的。 (因此它是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,它确保你指向类实例,而不是全局范围(窗口对象?),这是你以前做过的,修改{{1 }}

让它与anon一起工作就像你一样:

window.image

还要注意我触发了一个名为imageLoaded的事件,你可以从实例中使用它:

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