我有以下功能,只需清除模糊输入。我正在使用角度材料,我正在创建一个指令,以便在我希望发生这种情况时添加。
function clearTextOnBlurLink(scope, element, attrs, controller) {
$timeout(function() {
var input = element.find('input');
input.on('blur', function(e){
setTimeout(function(){
input.val('');
input.triggerHandler('input');
}, 100);
});
},0);
}
我想测试它,但我无法让它工作。
这是我的测试:
beforeEach(inject(function(_$rootScope_, _$compile_, _$timeout_) {
$scope = _$rootScope_.$new();
$compile = _$compile_;
$timeout = _$timeout_;
$scope.searchText = 'blah';
element = angular.element('\
<div mx-clear-on-blur> <input ng-model="searchText1"> </div>\
');
element = $compile(element)($scope);
$scope.$apply();
$timeout.flush();
}));
it('clears text on blur', function() {
var input = element.find('input').eq(0);
expect(input.val()).toBe('blah');
expect($scope.searchText).toBe('blah');
input1.triggerHandler('blur');
expect(input.val()).toBe('');
expect($scope.searchText).toBe('');
});
好的,所以我让它将setTimeout更改为$ timeout。 没有2次超时,是否有一种不那么笨重的方式呢?
答案 0 :(得分:0)
你有没有理由第二次使用setTimeout
?为什么不再使用$timeout
......?另外$timeout
通常有点代码味道,所以嵌套$timeouts
感觉有点不对。 :P
无论如何,我认为你的测试通过了你,在模糊后你的测试中需要$timeout.flush()
。
答案 1 :(得分:0)
您也可以在测试中使用setTimeout:
input1.triggerHandler('blur');
setTimeout(function() {
expect(input.val()).toBe('');
expect($scope.searchText).toBe('');
}, 100);
Jasmine应该还有一个waitsFor方法:
input1.triggerHandler('blur');
waitsFor(function() {
return false;
}, 100);
expect(input.val()).toBe('');
expect($scope.searchText).toBe('');