2017-08-09 48 views
0

如何让Angular 4/2按键事件同步运行? 当我运行这个代码时,键并不总是按照点火顺序运行。为什么Angular Keystrokes不能同步运行?或者我如何让它们同步运行?

模板

<div 
    contenteditable="true" 
    (keydown)="divKeyDown($event)" 
    (keyup)="divKeyUp($event)"> 
</div> 

组件

divKeyDown(event) { 
    console.log('Keydown'); 
    // OFTEN GETS FIRED BEFORE KEYUP OF PREVIOUS STROKE 
} 
divKeyUp(event) { 
    console.log('Keyup'); 
} 
+0

你需要像这样的Plnkr吗? https://plnkr.co/edit/GYWY2HxFz41tmiXswFNs?p=preview(按下Ctrl键),检查我是否使用@HostListener。 –

+0

@JancoBoscan我看到与发布的OP相同的问题(https://plnkr.co/edit/xN38ZlziYdqYI8qJsDDZ?p=preview)。 JustinLevine我认为这个功能发生是因为keyup&keydown是独立的事件流。所以我不知道是否有什么可以做的。你想达到什么目的? – LLai

+0

@LLai我相信这是因为EventEmitter在后台使用,但是在其构造函数中有一个isAsync切换。我想知道是否有可能通知它它不是异步的。在我的理解中,我控制了keydown上的输入,然后重置keyup事件中的插入符号位置。如果它们不同步触发,那么当键盘事件被快速触发时会被搞砸。 –

回答

0
  • 当钥匙已经成为名副其实起来并且没有其他按键的关注KEYUP仅触发。

  • 按键将是一个更好的事件在这种情况下使用,因为它总是在keydown后直接触发,并且从未在另一个按键之前触发。

  • 这是默认行为,不直接与Angular相关。

即使在香草JS,相同的行为观察:

document.getElementById('main').addEventListener('keydown', event => { 
    console.log('keydown'); // FIRED ONCE 
}); 
document.getElementById('main').addEventListener('keypress', event => { 
    console.log('keypress'); // FIRED AFTER KEYDOWN 
}); 
document.getElementById('main').addEventListener('keyup', event => { 
    console.log('keyup'); // FIRED WHEN THE KEY HAS LITERALLY BEEN RELEASED 
}); 

(在这种情况下我有“的keydown”后直接使用角的“ngAfterViewChecked”生命周期钩来处理状态的变化活动已完成)