gpt4 book ai didi

angular - nativeElement.click() 和事件处理程序的点击有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 17:13:16 27 4
gpt4 key购买 nike

我一直在尝试对单击调用函数的提交按钮的 Angular 2 应用程序执行测试。我通常使用两种方法来执行相同的操作。

element.nativeElement.click()

element.triggerEventHandler('click',null);

我认为这两种方法是相同的,直到我遇到触发事件处理程序方法不起作用的情况。

element = fixture.debugElement.query(By.css('.dropList li'));
element.triggerEventHandler('click',null); //Click event works here
fixture.detectChanges();
let button = fixture.debugElement.query(By.css('button'));
//button.triggerEventHandler('click',null); //Does not call function
button.nativeElement.click(); //Calls function
fixture.detectChanges();

供您引用的模板:

<form (ngSubmit)="printSelection()">
<div class="dropList">
<ul>
<li *ngFor="let element of data.elements" (click)="selectElement(element)"> </li>
</ul>
</div>
<button type="submit">Submit</button>
</form>

那么,这两种方法之间有什么区别吗?或者您认为我的代码某处可能出错了吗?

最佳答案

element.nativeElement.click()

native method模拟鼠标点击元素。它在冒泡,其行为方式与我们单击该元素的方式相同。

debugElement.triggerEventHandler(eventName, eventObj)

是 Angular 内置方法,它只调用当前调试元素上给定事件名称的所有监听器:

triggerEventHandler(eventName: string, eventObj: any) {
this.listeners.forEach((listener) => {
if (listener.name == eventName) {
listener.callback(eventObj);
}
});
}

DebugRenderer2 运行 listen 方法时添加监听器:

listen(
target: 'document'|'windows'|'body'|any, eventName: string,
callback: (event: any) => boolean): () => void {
if (typeof target !== 'string') {
const debugEl = getDebugNode(target);
if (debugEl) {
debugEl.listeners.push(new EventListener(eventName, callback));
}
}

return this.delegate.listen(target, eventName, callback);
}

当我们将事件绑定(bind)应用于像这样的元素时会发生这种情况

  • (点击)="handler()"
  • @HostListener('点击')
  • host: '{ '(mouseenter): 'handler()'
  • renderer.listen

假设我们有以下模板:

<div (click)="test()">
<div class="innerDiv">
{{title}}
</div>
</div>

我们的测试将如下所示:

de = fixture.debugElement.query(By.css('.innerDiv'));

de.nativeElement.click(); // event will be bubbled and test handler will be called

de.triggerEventHandler('click', null); // there is not handlers for click event
// that angular added to this element
// so test method won't be called

然后让我们看看您的模板。 button 没有处理程序,因此 triggerEventHandler 不会有任何效果。另一方面,button.nativeElement.click(); 将触发提交,因为按钮具有提交类型及其在单击事件时按钮的标准行为。

关于angular - nativeElement.click() 和事件处理程序的点击有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46425635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com