如何调用triggerHandler与特定的假“事件”参数?参数、事件、triggerHandler

2023-09-13 03:06:50 作者:塞纳河畔

我试图测试上的链接点击'preventDefault之称。不过,我有困难,以取代一个真正的'事件'对象,我可以窥探:

I'm trying to test that on a link click 'preventDefault' is called. However, I have difficulties to replace a real 'event' object with one I can spy on:

下面是如何触发我的单击事件:

Here is how I trigger the click event:

var e = jasmine.createSpyObj('e', [ 'preventDefault' ]);
$element.triggerHandler('click', [e]);

然而,当该指令code为正在运行,事件元件不与更换一个假

However, when the directive code is being run, the event element is not replaced with a fake one:

$element.on('click', function(event) {
    console.log(event);
}

我尝试添加第二个参数来triggerHandler不同的方式 - 作为数组,作为一个对象,只是一些线等工作都没有。它triggerHandler的没有那么多的例子也连同其他参数,所以我觉得一点点失去了...

I tried different ways of adding a second parameter to triggerHandler - as an array, as an object, just some line, etc. Neither worked.. It is also not that many examples of triggerHandler together with additional parameters, so I feel a little bit lost...

在此先感谢!

推荐答案

的文档说 triggerHandler()通过虚拟对象的处理程序:的 http://docs.angularjs.org/api/ng/function/angular.element

The docs say that triggerHandler() passes a dummy object to the handler: http://docs.angularjs.org/api/ng/function/angular.element

如果您检查源代码,你可以看到, triggerHandler()创建自己的事件对象,然后通过你的第二个参数作为事件数据,而不是实际的事件对象:

If you check the source, you can see that triggerHandler() creates its own event object, and then passes your second argument as the event data, not the actual event object:

https://github.com/angular/ angular.js / BLOB /主/ src目录/ jqLit​​e.js#L882

相关code:

var event = [{
  preventDefault: noop,
  stopPropagation: noop
}];

forEach(eventFns, function(fn) {
  fn.apply(element, event.concat(eventData));
});

我使用jQuery的内部事件模拟器,用于创建我自己的事件。这可能为你工作:http://wingkaiwan.com/2012/09/23/triggering-mouse-events-with-jquery-simulate-when-testing-in-javascript/