установить значение поля из внутреннего объекта JavaScript - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть класс с именем light, который загружает свое состояние с помощью ajax:

function Light(name, channel, type, state) {
this.name = name;
this.channel;
this.type=type;
this.state = state;   //0=off  1=on
this.turnOn = function () {
    this.state = 1;
    $('#luce-' + name).attr('src', controlImagePath + '' + type + '100.png');
}
this.turnOff = function () {
    this.state = 0;
    $('#luce-' + name).attr('src', controlImagePath + '' + type + '00.png');
}
this.toggle = function () {
    if (this.state == 0) this.turnOn();
    else this.turnOff();
}
this.checkState = function () {
    var result;
    $.jsonp({
        callback: "callback",
        url: 'http://' + serverAddress + ':' + serverPort + '/GetChannelValueAsJsonp?channelName=' + channel + '&callback=?',
        success: function (data) {
            if (data > 0) {
                 this.turnOn();
            } else {
                 this.turnOff();
            }
        },
        error: function (xOptions, textStatus) {
            console.log("error");               
        }
    });
}

}

Он продолжает выдавать ошибку:

Uncaught TypeError: Object #<Object> has no method 'turnOn'

И я подозреваю, чтоэто из-за функции успеха, которая переопределяет область Света.Как мне обратиться к объекту из другой области действия функции?
IE в Java я бы сделал Light.this.turnOn () ... Как это сделать с помощью JavaScript?
Спасибо!

1 Ответ

4 голосов
/ 07 ноября 2011

this внутри функции обратного вызова XHR ссылается на объект jQuery / XHR.Вы должны сохранить ключевое слово this в переменной:

this.checkState = function () {
    var result;
    var $this = this;  //Saving `this`
    $.jsonp({
        callback: "callback",
        url: 'http://' + serverAddress + ':' + serverPort + '/GetChannelValueAsJsonp?channelName=' + channel + '&callback=?',
        success: function (data) {
            if (data > 0) {
                 $this.turnOn(); //Referring to `this` through $this`
            } else {
                 $this.turnOff();
            }
        },
        error: function (xOptions, textStatus) {
            console.log("error");               
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...