Невозможно получить события keydown документа с Object.assign
Я использую
sources.DOM.select('document').events('keydown')
.map(ev => Object.assign({}, ev, {type: 'keydown'}))
но результирующий поток дает объекты только со свойством isTrusted (а не "ключом", "кодом" и т. д.). Вместо этого с помощью "mousemove" я получаю события, как и ожидалось (с "isTrusted", но также "motionX", "motionY" и т. Д.). Что случилось?
1 ответ
Решение
Вы правы, не проблема 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() - Простой пример