2014-01-13 2 views
2

У меня есть что-то вроде следующего:Как получить «это» в эту функцию ... JQuery слайдер

MyShape = function() { 

    var _container = { 
     width: 100, 
     height: 100 
    } 


    this.draw() { 
     //do stuff... 
    } 

    $('#slider-1').bind('change', function(event, ui) { 

     _container.width = $('#slider-1').val(); 
     this.draw(); 

    }); 


}; 

Я использую ползунок JQuery динамически изменять ширину моей формы, затем я вызываю .draw(), чтобы перерисовать фигуру. Я получаю эту ошибку, хотя:

Uncaught TypeError: Object # has no method 'draw'

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

ответ

9

Это вызвано тем, что JavaScript's this is dynamic.

Вы можете использовать Function.prototype.bind так:

$('#slider-1').on('change', function(event, ui) { 

    _container.width = $('slider-1').val(); 
    this.draw(); 

}.bind(this) /* use the same this value */); 

Или вы можете использовать замыкание переменной

var that = this; 
$('#slider-1').on('change', function(event, ui) { 

    _container.width = $('slider-1').val(); 
    that.draw(); 

}); 
+1

Также [ '$ .proxy'] (http://api.jquery.com/ jQuery.proxy /), хотя, как мне кажется, 'bind' является более чистым в этом примере. – crush

+2

@Benjamin - хорошо своевременное редактирование; Я хотел бы указать, что вам нужно использовать '.on' :) – Tyblitz

+1

Это сработало спасибо – user602525

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