2013-06-18 2 views
0

Мне нужно запустить пользовательские события из класса. Я знаю, что делать это с объектами DOM и jquery, используя triggerHandler, например $ (object). TriggerHandler ("inputChange", {param: X}); Проблема заключается в том, когда я пытаюсь это с классом, как это:Пользовательские события в CLASS

var MyClass = (function(){ 

     var static_var = 1; 

     var MyClass = function() { 

      var privateVar; 
      var privateFn = function(){ alert('Im private!'); }; 

      this.someProperty = 5; 
      this.someFunction = function() { 
       alert('Im public!'); 
      }; 
      this.say = function() { 
       alert('Num ' + this.someProperty); 
       $(this).triggerHandler("eventCustom"); 
      } 
      this.alter = function() { 
       this.someProperty ++; 
      } 
     }; 

     return MyClass; 

    })(); 

    TheClass = new MyClass(); 

    $(TheClass).on('eventCustom', function() { 
     alert('Event!'); 
    }); 

    TheClass.say(); 

Это не запускает предупреждения или ошибки, но события слушатель не работает (или событие не отправляется). Я думаю, что система событий jQuery не работает с объектом DOM, правильно?

Любой другой способ (мне нужны события, а не обратные вызовы для моего конкретного случая) для запуска событий?

Большое спасибо!

+0

* "я думаю, что система событий jqeury работы ж доцент с не DOM-объектом "* Неверно: http://api.jquery.com/jQuery/#working-with-plain-objects. Вопрос в том, работает ли он с объектами, созданными с помощью функций-конструкторов. –

ответ

6

Ваше понимание работы javascript ограничено, так как вы приближаетесь к нему с традиционной точки зрения ООП. Взгляните на эту скрипту http://jsfiddle.net/9pCmh/ &, вы увидите, что вы можете передавать функции как переменные другим функциям. Там нет классов в JavaScript, только функции, которые могут быть замыканием, которые могут быть сделаны, чтобы эмулировать традиционные классы:

var MyClass = (function(){ 

    var static_var = 1; 

    var MyClass = function (callback) { 

     var privateVar; 
     var privateFn = function(){ alert('Im private!'); }; 

     this.someProperty = 5; 
     this.someFunction = function() { 
      alert('Im public!'); 
     }; 
     this.say = function() { 
      alert('Num ' + this.someProperty); 
      callback(); 
     } 
     this.alter = function() { 
      this.someProperty ++; 
     } 
    }; 

    return MyClass; 

})(); 

TheClass = new MyClass(function() { 
    alert('Event!'); 
}); 

TheClass.say(); 

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

Посмотрите на это как начало для вашего дальнейшего чтения по этой концепции ... How do JavaScript closures work?

Редактировать

Чтобы успокоить тех критиков, которые ищут EventQueue здесь обновленный jsfiddle :)

http://jsfiddle.net/Qxtnd/9/

var events = new function() { 
    var _triggers = {}; 

    this.on = function(event,callback) { 
     if(!_triggers[event]) 
      _triggers[event] = []; 
     _triggers[event].push(callback); 
    } 

    this.triggerHandler = function(event,params) { 
     if(_triggers[event]) { 
      for(i in _triggers[event]) 
       _triggers[event][i](params); 
     } 
    } 
}; 

var MyClass = (function(){ 

     var MyClass = function() { 

      this.say = function() { 
       alert('Num ' + this.someProperty); 
       events.triggerHandler('eventCustom'); 
      } 
     }; 

     return MyClass; 

    })(); 

    TheClass = new MyClass(); 

    events.on('eventCustom', function() { 
     alert('Event!'); 
    }); 
    events.on('eventCustom', function() { 
     alert('Another Event!'); 
    }); 

    TheClass.say(); 
+0

Хотя это может сработать, система событий, предлагаемая jQuery, намного превосходит. Он действительно не отвечает на вопрос IMO, OP явно заявляет * «Любой другой способ (мне нужны события, а не обратные вызовы для моего конкретного случая) для запуска событий?» *. И они уже знают о передаче функций другим функциям, они делают это при вызове '.on'. –

+0

@FelixKling Пожалуйста, объясните мне, как события jQuery превосходят закрытие/обратные вызовы javascript? События jQuery - это обратные вызовы. По сути, событие является обратным вызовом в javascript, единственное различие заключается в том, что вы можете размещать в очереди события, которые вы можете легко выполнить с помощью обратных вызовов javascript. Понимание OP того, что событие в javascript является ошибочным, потому что он думает в терминах ООП. Я знаю, что я пришел из C++ и использовал PHP, поэтому у меня была огромная кривая обучения. – Precastic

+0

В вашем примере вы можете передать * один обратный вызов * экземпляру, в момент его создания. Благодаря надлежащей системе событий вы можете в любое время связать несколько разных обработчиков событий. Это то, что я имел в виду. Конечно, «обратные вызовы» - это просто популярный термин, который передается функции другой функции. –

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