首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在angular指令中测试按键事件

如何在angular指令中测试按键事件
EN

Stack Overflow用户
提问于 2020-09-09 21:59:19
回答 2查看 290关注 0票数 0

我在Angular中有一个指令,当满足文本区域的最大长度时,它会阻止使用Enter

代码语言:javascript
运行
复制
@Directive({
    selector: '[abEnter]'
})
export class EnterDirective {
    @HostListener('keypress', ['$event'])
    onKeypress(event) {
        if ((event.target.textLength >= event.target.maxLength) && (event.keyCode === 13)) {
            event.preventDefault();
        }
    }
}

不确定如何测试它。正在尝试像这样的东西

代码语言:javascript
运行
复制
    it('should allow Enter key when maxlength is not met', () => {
            component.textareaValue = 'abc';
            fixture.detectChanges();
            
            const event = createEnterKeyPress();
            element.triggerEventHandler('keypress', event);
            expect(event.preventDefault).not.toHaveBeenCalled();
        });
    
        function createEnterKeyPress() {
            return {keyCode: 13, preventDefault: jasmine.createSpy('preventDefault')};
        }

但是它并没有像预期的那样工作。

元素是:

代码语言:javascript
运行
复制
element = fixture.debugElement.query(By.css('textarea'));
EN

回答 2

Stack Overflow用户

发布于 2020-09-10 02:05:50

您应该使用dispatchEvent

代码语言:javascript
运行
复制
it('should allow Enter key when maxlength is not met', () => {
    component.textareaValue = 'abc';
    fixture.detectChanges();
            
    element.dispatchEvent(new Event('keypress', {keyCode: 'enter'}))
    expect(event.preventDefault).not.toHaveBeenCalled();
});

注意:"keypress“已被弃用。但是你可以使用任何你想要的事件类型。

票数 0
EN

Stack Overflow用户

发布于 2020-09-10 23:15:12

感谢您的回复。我试着这样做:

代码语言:javascript
运行
复制
fit('should not allow Enter when maxlength (10) is met', () => {
        component.textareaValue = '0123456789';
        fixture.detectChanges();

        const keydownEvent = new Event('keypress') as any;
        keydownEvent.which = KeyCodes.ENTER;
        keydownEvent.keyCode = KeyCodes.ENTER;
        const spy = spyOn(keydownEvent, 'preventDefault');

        const element: HTMLTextAreaElement = fixture.debugElement.query(By.css('textarea')).nativeElement;
        element.dispatchEvent(keydownEvent);
        expect(spy).toHaveBeenCalled();
    });

我希望它作为mexlength被满足,并且应该调用preventDefault,但在这种情况下它失败了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63813287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档