2014-10-28 4 views
0

Этот код находится в KnockoutJS ViewModel:KnockoutJS: Функция Scope ошибок

function myViewModel() 
{ 
    this.prop1 = ko.observable(123); 
    this.prop2 = ko.observable("Hello"); 
    .. 
    .. 
} 

myViewModel.prototype.func1 = function() 
    { 
    alert(this.prop1());    //works fine here 

     myTimer = setTimeout(function() 
     { 
      alert(this.prop1()); //this.prop1() raises an undefined error 
     }, 3000);     //from console: Uncaught TypeError: undefined is not a function 
}; 

Почему свойство не распознается в функции обратного вызова таймера? Похож на проблему с областью, но я не могу ее решить.

ответ

2

Вы должны прочитать о Javascript scopes и the var self = this idiom. Ключ this может вести себя неожиданно в функциях обратного вызова, так как он может быть установлен на что-то неожиданное (например, функция, вызывающая обратный вызов тайм-аута, или window или ...).

Что-то вроде * это будет немедленным решением вашей проблемы:

myViewModel.prototype.func1 = function() 
{ 
    var self = this; 
    alert(self.prop1());    //works fine here 

    myTimer = setTimeout(function() { 
     alert(self.prop1()); 
    }, 3000);     
}; 

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

+0

Здравствуйте, Jeroen, и спасибо миллион; кто это сделал. Вы посоветовали мне читать в JavaScript области в другом посте, но, к сожалению, я этого не сделал. Я никогда не понимал ключевое слово self. Большое спасибо. – iSofia

+0

Рад, что это помогло. Даже если у вас нет времени на это читать (это плотная тема), просто не забудьте всегда начинать свои конструкторские функции с помощью 'var self = this;' и использовать 'self' вместо' this' всюду, и вы будете избавлены от множества проблем. – Jeroen

+0

Я обязательно сделаю это. Спасибо за подсказку и за решение. Ты спасатель жизни, Джеруэн. – iSofia

Смежные вопросы