Как в Node / raw ES6 я мог испустить событие из родительского класса и вызвать событие в дочернем классе из их соответствующих конструкторов?

В настоящее время я работаю над "JS track - react project" на сайтеexperimentism.io (нет, не реагирую). Упражнение состоит в том, чтобы классы реагировали на действия друг друга. Я не был уверен, что наследование было лучшим вариантом, но я чувствую, что это так близко, как я собираюсь получить. (P.S. Это мой первый пост здесь, я перепробовал немало мест, прежде чем решил задать здесь свой первый вопрос. ('P.P.S.') => 'Howdy' :)

`class InputCell extends EventEmitter {
  constructor(value) {
    super(value);
    this.value = value;
  }

  setValue(value) {
    this.value = value;

    // I'm assuming this emitter doesn't leave the scope of the object it creates?
    this.emit('cellChange');
  }
}

class ComputeCell extends InputCell {
  constructor(cells, compute) {
    super(cells, compute);
    this.value = compute(cells);

    // super wasn't my first choice, but 'this' didn't work either
    super.on('cellChange', () => compute(cells));
  }
}`

Edit- Мои извинения, вот провальный тест, который я провёл.

`  test('compute cells update value when inputs are changed', () => {
    const inputCell = new InputCell(1);

    const computeCell = new ComputeCell(
      [inputCell], inputs => inputs[0].value + 1
    );

    inputCell.setValue(3);

    expect(computeCell.value).toEqual(4);
  });

`

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

Bergi 08.10.2018 09:35

Нет, наследование кажется неправильным выбором, если вы хотите прослушивать события объекта Другая. Эмиттер событий там нормально. Похоже, ваш ComputeCell принимает в качестве аргумента массив InputCells, верно?

Bergi 08.10.2018 09:37

С другой стороны, наследование могло бы быть решением, и вы просто перезаписали бы метод setValue. Однако тогда вы бы не стали использовать события.

Bergi 08.10.2018 09:37

Извините, я должен был упомянуть тестовый сценарий для этого. Все, что он делает, это создает экземпляр каждого объекта, вызывает созданный экземпляр inputCell.setValue, а затем утверждает значение созданного экземпляра computeCell, чтобы увидеть, обновляется ли оно при вызове setValue () inputCell.

TJ Allen 09.10.2018 06:32

Да, как и ожидалось в моем втором комментарии. Нет, ComputeCell должен наследовать нет от InputCell, он должен использовать экземпляр InputCell, который он получает в конструкторе.

Bergi 09.10.2018 10:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
141
1

Ответы 1

@TJ Allen: Я застрял на том же упражнении, но нашел страницу с решениями: https://exercism.io/tracks/javascript/exercises/react/solutions

потребовалось некоторое время, но я нашел это объяснение достаточно простым для моего понимания (особенно для опубликованного вами тестового примера):

export class InputCell {
  constructor(value) { // test 1: accepts input
    this.value = value;
  }

  setValue(value) {
    this.value = value; // test 2: allows input  value to be set
  }
}

export class ComputeCell {
  constructor(inputCells, func) { // test 3: allows setting compute cells
    this.inputs = inputCells;
    this.func = func;
  }

  get value() {
    return this.func(this.inputs); // test 5: compute cells update value when inputs are changed
  }
}

Обратите внимание, что для других пользователей runningism.io я пропустил комментарий для тест 4:вычислительная ячейка принимает входные данные в правильном порядке, поскольку он был менее актуален для заданного здесь вопроса.

Обновлено: Лично я думаю, что формулировка этого конкретного случая теста 5 расплывчатый и запутанный.

"compute cells update value when inputs are changed"

Какие входы и где? Похоже, он просит вас использовать какой-то прослушиватель событий, чтобы значения внутри InputCell автоматически вызывали изменение значений внутри ComputeCell - bc. Я думал то же самое.

Но, глядя на тест, я думаю, что они на самом деле просят: если вы инициализируете новый экземпляр InputCell с номером и проходить этот экземпляр в качестве аргумента для создания нового экземпляра ComputeCell, тогда ваш новый экземпляр ComputeCell будет обновлен. его value (через геттер) основан на value экземпляра InputCell, который вы ему передали. Было бы понятнее, если бы в тестовом сообщении было что-то такое:

"compute cells return different value when called with new inputs"

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

Другие вопросы по теме