我有以下创建input
元素的AngularJS指令。输入具有ng- change
运行doIt()
功能的属性。在指令的单元测试中,我想检查doIt
用户更改输入时是否调用了函数。但是测试没有通过。虽然在手动测试时可以在浏览器中使用。
指示:
...
template: "<input ng-model='myModel' ng-change='doIt()' type='text'>"
测试:
el.find('input').trigger('change') // Dos not trigger ng-change
实时演示(ng-change):http :
//plnkr.co/edit/0yaUP6IQk7EIneRmphbW?p=preview
现在,如果我手动绑定change
事件而不是使用ng-change
属性,则测试通过。
template: "<input ng-model='myModel' type='text'>",
link: function(scope, element, attrs) {
element.bind('change', function(event) {
scope.doIt();
});
}
现场演示(手动绑定):http :
//plnkr.co/edit/dizuRaTFn4Ay1t41jL1K?p=preview
有没有一种方法可以使用ng-change
并使其可测试?谢谢。
根据您的解释性意见:
我在指令的测试中要做的只是检查
doIt
用户更改输入时调用了该指令。
指示符ng- change
是否正确评估是ngModel
指示符的责任,因此,我不确定是否可以通过这种方式对其进行测试;相反,我相信ngModel
and
ngChange
指令已正确实现并经过测试可以调用指定的函数,并且只需测试调用函数本身以正确的方式影响指令即可。可以使用端到端或集成测试来处理整个使用场景。
也就是说,您可以掌握ngModelController
驱动ngModel
变更回调的实例并自行设置视图值:
it('trigger doIt', function() {
var ngModelController = el.find('input').controller('ngModel');
ngModelController.$setViewValue('test');
expect($scope.youDidIt).toBe(true);
});
但是,正如我所说,我觉得这已经太过ngModel
分担责任了,打破了自然可组合指令所带来的黑匣子。
示例:http://plnkr.co/edit/BaWpxLuMh3HvivPUbrsd?p
= preview
[更新]
浏览AngularJS源代码后,我发现以下内容也适用:
it('trigger doIt', function() {
el.find('input').trigger('input');
expect($scope.youDidIt).toBe(true);
});
看起来某些浏览器中的事件有所不同;input
似乎适用于Chrome。
示例:http://plnkr.co/edit/rbZ5OnBtKMzdpmPkmn2B?p
= preview
以下是相关的AngularJS代码,该代码使用$sniffer
服务确定要触发的事件:
changeInputValueTo = function(value) {
inputElm.val(value);
browserTrigger(inputElm, $sniffer.hasEvent('input') ? 'input' : 'change');
};
即使有了这个,我也不确定我是否会以此方式测试指令。
本文向大家介绍AngularJS ng-mousedown 指令,包括了AngularJS ng-mousedown 指令的使用技巧和注意事项,需要的朋友参考一下 AngularJS ng-mousedown 指令 AngularJS 实例 在鼠标按下时执行表达式: 定义和用法 ng-mousedown 指令用于告诉 AngularJS 鼠标在指定的 HTML 元素上按下时要执行的操作。 ng-m
问题内容: 我一直在研究修改AngularJS ng-click指令以添加一些其他功能。对于如何使用它,我有一些不同的想法,但是一个简单的想法是将Google Analytics(分析)跟踪添加到所有ng-clicks,另一个是防止双击。 为此,我的第一个想法是使用装饰器。所以像这样: 但这不会起作用,因为装饰器会在实例化时触发,而不是在满足指令中的表达式时触发。因此,在这种情况下,它将在加载带有
问题内容: 我想对一个模拟占位符的指令进行单元测试,其中仅在键入/按下事件时才清除输入值。 问题答案: 您需要以编程方式创建一个事件并触发它。为此,将jQuery用于单元测试非常有用。例如,您可以编写一个简单的实用程序,如下所示: 然后在您的单元测试中使用它,如下所示: 您可以在http://angular-ui.github.io/bootstrap/项目中查看此技术的实际应用:https :
问题内容: 我正在尝试在应用程序中使用AngularJS,并在某种程度上取得了成功。 我能够获取数据并将其显示给用户。我有一个按钮,我想通过该按钮发布DELETE请求。下面是我的代码。 这是获取信息并将其显示给用户的功能。 数据已获取并正确显示。 但是,单击删除按钮后,不会触发其中的代码。在GoogleChrome浏览器的开发人员工具中,我可以看到为代码生成了有效值,但未触发代码。从我尝试去掉花括
我是新的angularjs。我想动态添加指令到基于标题的div从控制器...下面是我尝试的... 以下是我使用的指令和工厂 下面是我如何使用ng repeat 这不管用
问题内容: 我想触发一个包含jQuery指令的AngularJS自定义指令。如何做呢?我已经在指令中阅读了关于发射功能的信息? 想法? 问题答案: 您可以使用服务在控制器和指令之间进行通信。 服务可能如下所示: 该指令可以响应服务: 只需将我所做的替换为jQuery操作,您就应该拥有所需的东西。 这是一个有效的小提琴:http : //jsfiddle.net/jeremylikness/wqXY