Не удается получить события keydown документа с Object.assign - PullRequest
0 голосов
/ 04 ноября 2018

Я использую

sources.DOM.select('document').events('keydown')
  .map(ev => Object.assign({}, ev, {type: 'keydown'}))

но результирующий поток дает объекты только со свойством isTrusted (а не с ключом, кодом и т. Д.). Вместо этого с помощью «mousemove» я получаю события, как и ожидалось (с «isTrusted», но также «MoveX», «MoveY» и т. Д.). Что не так?

1 Ответ

0 голосов
/ 06 ноября 2018

Вы правы, не проблема Cycle.js , а ограничение Object.assign.

Проще говоря, Object.assign не копирует унаследованные свойства.

Этот ответ о аналогичной проблеме предоставил рабочую альтернативу:

function main (sources) {
  const vdom$ = sources.DOM.select('document').events('keydown')
    .map(ev => cloneEvent(ev))
    .map(mykey => div('Key pressed: ' + mykey.key + ', code:' + mykey.code))
    .startWith(div('Press a key.'))

  return {
    DOM: vdom$
  }
}

function cloneEvent(e) {
  if (e===undefined || e===null) return undefined;
  function ClonedEvent() {};  
  let clone=new ClonedEvent();
  for (let p in e) {
    let d=Object.getOwnPropertyDescriptor(e, p);
    if (d && (d.get || d.set)) Object.defineProperty(clone, p, d); else clone[p] = e[p];
  }
  Object.setPrototypeOf(clone, e);
  return clone;
}

См. Обновленный пример codepen.io .

Эти вопросы и ответы SO также помогли прояснить ситуацию:

Плохой вариант использования Object.assign () - Простой пример

Javascript hasOwnProperty всегда false для объектов Event?

...