можно использовать Event.ispatcher three.js для связи между классами? - PullRequest
0 голосов
/ 07 октября 2018

Основной вопрос

Событие, генерируемое в одном классе, который поддерживает EventDispatcher, не обрабатывается другим классом, который поддерживает EventDispatcher.

Как заставить общение работать во всем приложении, чтобы я мог передавать сообщения?

На данный момент кажется, что он поддерживает только передачу сообщения своему классу.

Справочная информация

Я использую этот шаблон, который дает мне Three.js и ES6:

https://github.com/paulmg/ThreeJS-Webpack-ES6-Boilerplate

Я обновил пакеты вручную, чтобы использовать three.js r97.

Я смотрю на класс EventDispatcher и думаю, что этодля меня это чистый способ передавать сообщения по всей системе, оставляя ее разъединенной.Например, у меня есть некоторый пользовательский интерфейс HTML, который наблюдает за флажком.

Урезанный до основного примера, у меня есть взаимодействие.до основных битов):

import {EventDispatcher} from 'three';

export default class BoxManager {
    constructor() {
        // Add event dispatcher support
        Object.assign( this, EventDispatcher.prototype );
    }

    setupBoxes(manager) {
        console.log("adding event listener on BoxManager.js");
        this.addEventListener( 'boxOpenStateToggled', function ( event ) {
            console.log("event caught by BoxManager.js", event);        
        } );
    }
}

Когда я запускаю событие boxOpenStateToggled на Interaction, прослушиватель событий BoxManager не захватывает его.

Я получаю консольный журналвот так:

adding event listener on BoxManager.js
adding event listener on Interaction.js

(I trigger the event)

event emitting
event caught in Interaction.js {type: "boxOpenStateToggled", message: {…}, target: Interaction}
event emitted

Что я ожидал здесь, так это увидеть «событие, пойманное в BoxManager» - это системный диспетчер событий?Или он может отправлять события только для каждого отдельного класса?

Показывая мою работу

Я не был уверен, что это то, с чем я его использовал, поэтому я попытался:

  • с использованием ключевого слова extends в классе, чтобы дать функциональность EventDispatcher, и это работает, но только внутри класса.

  • с использованием.call версия изначально, которая была в более раннем выпуске three.js.

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

Я неправильно понял его цель?Я использую это неправильно?

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете подумать о том, чтобы сделать что-то вроде этого:

const myEventBus = new THREE.EventDispatcher()

const foo = new Foo(myEventBus)
const bar = new Bar(myEventBus)

Если вы хотите избежать передачи экземпляра подобным объектам или создать фабрики, вы можете сделать что-то вроде этого:

//Events.js
const Events = new THREE.EventDispatcher()
export default Events

А затем:

//Foo.js
import Events from 'common/Events'
import {BOX_OPEN} from 'Bar'
export default class Foo {
  constructor(){
    Events.addEventListener( BOX_OPEN, this.onBoxOpen);
  }
}

Отправка

//Bar.js

export const BOX_OPEN = 'box_open'

export default class Bar {
  constructor(){
    $("#" + Config.uiElements.boxOpenStateId).change(this.onChange);
  }
  onChange = () => {
     console.log("event emitting");
     Events.dispatchEvent({ type: BOX_OPEN, message: { isChecked: "example" } });
     console.log("event emitted");
  }
}
...