2015-11-19 5 views
1

Я пытаюсь использовать createjs EventDispatcher как способ отправки элементов из класса. Я расширяю свой класс с помощью createjs.EventDispatcher и используя диспетчер отправки для запуска события.TypeScript + Class + createjs.EventDispatcher

я получаю следующее сообщение об ошибке, когда эта линия this.dispatchEvent(createJSEvent); выполнена:

Uncaught InvalidStateError: Failed to execute 'dispatchEvent' on 'EventTarget': The event provided is null. enter image description here

упрощенный код машинопись, чтобы продемонстрировать, что я хотел бы сделать:

export class deviceOrientation extends createjs.EventDispatcher { 
 
     constructor() { 
 
      super(); 
 
      // wait 2 seconds and then fire testDispatch 
 
      setTimeout(this.testDispatch(), 2000); 
 
     } 
 
     testDispatch():void { 
 
      var createJSEvent:createjs.Event = new createjs.Event("change", true, true); 
 
      this.dispatchEvent(createJSEvent);   
 
      } 
 
    } 
 

 
    // This is the starting function 
 
    export function appExternalModuleTest(): void { 
 
     let _deviceOrientation: deviceOrientation; 
 
     _deviceOrientation = new deviceOrientation(); 
 
     _deviceOrientation.addEventListener("change",() => this.changeOrientation()); 
 
     //_deviceOrientation.on("progress",() => this.changeOrientation()); 
 
    } 
 

 
    export function changeOrientationi(event: Event): void { 
 
     console.log('orienationHasChanged '); 
 
    }

Я использую easeljs-0.8.1.min.js

Я не уверен, что это возможно с помощью CreateJS. Есть ли лучший подход? Любая помощь очень ценится.

+0

Обнаружена проблема: 'setTimeout (this.testDispatch(), 2000);' неправильно указан и вызывает проблему! Добавление функции стрелки для установки тайм-аута решает проблему и ошибок нет! 'setTimeout (() => {this.testDispatch();}, 2000);' –

+0

Если вы ищете автономную версию EventDispatcher CreateJS для TypeScript, я преобразовал версию .js в .ts. Вы можете скачать здесь [https://github.com/dbiele/TypeScriptEventDispatcher](https://github.com/dbiele/TypeScriptEventDispatcher) –

ответ

1

Проблема выглядит странно, потому что я делаю почти то же самое в своем проекте и не испытываю никаких проблем.

В двух словах, у меня есть файл d.ts для объявления классов createjs, и я использую эти объявления в своих «нормальных» классах типов.

Например:

d.ts:

declare module createjs 
{ 
    export class EventDispatcher 
    { 
     addEventListener(type: string, listener: any, useCapture?: boolean): void; 

     removeEventListener(type: string, listener: any, useCapture?: boolean): void; 
     removeAllEventListener(type?: string): void; 

     dispatchEvent(event: Event): boolean; 
    } 

    export class Event 
    { 
     public type: string; 

     public target: any; 
     public currentTarget: any; 

     constructor(type: string, bubbling?: boolean, cancelable?: boolean); 

     clone(): Event; 
    } 
} 

Нормальный класс:

module flashist 
{ 
    export class TestEventDispatcher extends createjs.EventDispatcher 
    { 
     public constructor() 
     { 
      super(); 
     } 

     public testDispatch(): void 
     { 
      var tempEvent: createjs.Event = new createjs.Event("test"); 
      this.dispatchEvent(tempEvent); 
     } 
    } 
} 

И где-то в коде, вы должны создать экземпляр класса TestEventDispatcher. Что-то вроде:

this.testDispatcher = new TestEventDispatcher(); 
this.testDispatcher.addEventListener("test", (event: createjs.Event) => alert("Test Event Listener")); 
this.testDispatcher.testDispatch(); 

Я только что протестировал код, и он работает для меня.

Единственная идея, которую я имею, это убедиться, что файл easel.js загружен перед вашими основными файлами приложения.

+1

Огромное спасибо за помощь! Ваш код очень помог изолировать и идентифицировать проблему. Моя проблема заключалась в том, как я тестировал событие отправки. Я использовал 'setTimeout (this.checkOrientation(), 2000);' в 'deviceOrientation', когда я должен был использовать функцию стрелки для правильной области видимости' setTimeout (() => {this.checkOrientation();}, 2000); 'Примеры по сути идентичны, за исключением того, что в моем примере используются внешние модули, а ваши используют внутренние (namespace) модули. Я использую 'definatelytyped' d.ts, используя tsd-npm [link] (https://www.npmjs.com/package/tsd), и вы используете пользовательский d.ts. –

+1

Я только что обновил свой фрагмент кода, чтобы лучше отразить проблему. –

+0

Я рад, что смог помочь вам! –

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