2009-06-06 2 views
2

Я пытаюсь написать собственный виджет, и я хочу использовать существующие виджеты пользовательского интерфейса в классе, который я пишу. Проблема в том, что при вызове события метод класса, который вызывается, выходит из области видимости из остальной части класса, так как любые члены, которые я пытаюсь прочитать, не определены. Вот код:JQuery Widget События в объекте Ориентированный Javascript

<script type="text/javascript"> 
MyClass = function() 
{ 
    this.init(); 
} 

$.extend(MyClass.prototype, 
    { 
     init: function() 
     { 
      this.field = 'Hello world.'; 

      /* Let's try using a slider. */ 
      this.slider = $("#slider"); 

      this.slider.slider(
       { 
        change: this.callback, 
        min: 270, 
        max: 800, 
        slide: this.callback 
       } 
      ); 
     }, 

     callback: function() 
     { 
      alert(this.field); 
     } 
    } 
); 
</script> 

<div id="slider"></div> 
<script type="text/javascript"> 
var myClass = new MyClass(); 
</script> 

Это упрощение задачи, и я попробовал несколько способов обойти это, например, с помощью bind вместо обратного вызова нотации:

this.slider.bind('slidechange', this.callback(this)); 
this.slider.bind('slide', this.callback(this)); 

Однако , это просто приводит к обратному вызову, несмотря на происходящее событие.

Спасибо.

ответ

3

http://www.alistapart.com/articles/getoutbindingsituations/ См для методов по связыванию this, с помощью затворов

EDIT: В качестве конкретного примера того, как это может быть достигнуто ...

$.extend(MyClass.prototype, 
{ 
    init: function() 
    { 
     this.field = 'Hello world.'; 

     /* Let's try using a slider. */ 
     this.slider = $("#slider"); 

     this.slider.slider(
      { 
       change: this.callback(this), 
       min: 270, 
       max: 800, 
       slide: this.callback(this) 
      } 
     ); 
    }, 

    callback: function(that) 
    { 
     return function() { 
      alert(that.field); 
     } 
    } 
} 
); 
+0

Спасибо за пример Джонатана, это работает. Артем, я не выполняю обратный вызов(), применяю (этот) подход. Где мне нужно делать то, что вы предлагаете? –

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