Реализация JavaScript-кода в ActionScript 3 EventDispatcher - PullRequest
1 голос
/ 11 августа 2011

Я портирую приложение ActionScript на JavaScript и пытаюсь усовершенствовать свою реализацию EventDispatcher.

Недавняя проблема, с которой я столкнулся, заключалась в том, что прикрепленные мной обратные вызовы не вызывались с правильным значением this. Я временно исправил это, добавив третий параметр в addEventListener с контекстом, который нужно отправить обратно, но это не идеально, поскольку он не соответствует тому же прототипу, что и эквивалентный actioncript.

Другая вещь, которую я попробовал, - это функция в стиле this.callback, но у нее есть еще больше проблем, особенно с removeEventListener.

Есть ли способ следовать стилю событий ActionScript в Javascript?

Моя текущая реализация приведена ниже: (зависит от jQuery / jQueryMX)

var EventDispatcher = jQuery.Class.extend({
  listeners: {},
  init: function() {
    this.listeners = {};
  },
  addEventListener: function(event, listener, context) {
    if (this.listeners.hasOwnProperty(event)) {
      this.listeners[event].push([listener,context]);
    } else {
      this.listeners[event] = [[listener,context]];
    }
  }, 
  hasEventListener: function() {
    console.error('hasEventListener unimplemented', arguments);
  },
  removeEventListener: function(event, listener) {
    if (this.listeners.hasOwnProperty(event)) {
      for (i in this.listeners[event]) {
        if (this.listeners[event][i][0] == listener) {
          this.listeners[event].splice(i,1);
          return true;
        }
      }
    } else {
      //console.log('no listener found for',event,listener,this);
      return false;
    }
  },
  dispatchEvent: function(event) {
    if (event.type && this.listeners.hasOwnProperty(event.type)) {    
      event.currentTarget = this;
      //console.log('dispatchEvent',event,this);
      for (i in this.listeners[event.type]) {
        if (typeof this.listeners[event.type][i][0] == 'function') {
          this.listeners[event.type][i][0].call(this.listeners[event.type][i][1],event);
        } 
      }
    } 
  }
});

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Actionscript 3 и Javascript - это принципиально разные языки.Вы можете поиграться с arguments.callee в вашей функции addEventListener и получить какое-то приближение интерфейса AS3 EventDispatcher, но невозможно (или желательно) точно сопоставить его, учитывая присущие различия между двумя языками.То, как мы обычно используем EventDispatcher в AS3, опирается на концепцию Bound Method , которого вообще нет в Javascript.

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

1 голос
/ 10 июля 2012

Вспомните в AS2, где у вас был полезный класс делегата, который может пригодиться.

...