2011-01-27 1 views
6

Я пытаюсь настроить объект так, чтобы он имел инкапсулированный метод $ .getJSON. Вот мои настройки:

function Property(price, deposit){ 
    this.price = price; 
    this.deposit = deposit; 
    this.getMortgageData = function(){ 
    $.getJSON('http://example.com/index?p='+this.price+'&d='+this.deposit+'&c=?', function(data){ 
     this.mortgageData = data; 
    }); 
    } 
    return true; 
} 

Теперь проблема, кажется, что у меня нет доступа к «это» внутри функции обратного вызова getJSON который имеет смысл.

Есть ли обходной путь для такого типа функций, или я просто думаю об этом совершенно неправильно? Я только когда-либо действительно кодировал с использованием PHP OO, прежде чем JS OO немного для меня.

Другие вещи, которые я пробовал являются:

function Property(price, deposit){ 
    this.price = price; 
    this.deposit = deposit; 
    this.getMortgageData = function(){ 
    this.mortgageData = $.getJSON('http://example.com/index?p='+this.price+'&d='+this.deposit+'&c=?', function(data){ 
     return data; 
    }); 
    } 
    return true; 
} 

Но все-таки,

var prop = new Property(); 
prop.getMortgageData(); 
// wait for the response, then 
alert(prop.mortgageData.xyz); // == undefined 

ответ

8

Ваша первая попытка закрыть, но, как вы сказали, вы не можете получить доступ к this внутри обратного вызова, потому что это относится к чему-то другому. Вместо этого назначьте this другому имени во внешней области и получите доступ к этому. Обратный вызов является закрытием и будет иметь доступ к этой переменной во внешней области:

function Property(price, deposit){ 
    this.price = price; 
    this.deposit = deposit; 
    var property = this; // this variable will be accessible in the callback, but still refers to the right object. 
    this.getMortgageData = function(){ 
    $.getJSON('http://example.com/index?p='+this.price+'&d='+this.deposit+'&c=?', function(data){ 
     property.mortgageData = data; 
    }); 
    } 
    return true; 
} 
+1

Спасибо, что сработало отлично. –

+0

Добро пожаловать! – kevingessner