我已经提供了这个代码:
在我的外部控制器中:
$scope.key = function ($event) {
$scope.$broadcast('key', $event.keyCode)
}
在我的内心控制器中(我有多个这样的人)
$scope.$on('key', function (e, key) {
if (key == 13) {
if (ts.test.current) {
var btn = null;
if (ts.test.userTestId) {
btn = document.getElementById('viewQuestions');
} else {
btn = document.getElementById('acquireTest');
}
$timeout(function () {
btn.focus();
btn.click();
window.setTimeout(function () {
btn.blur();
}, 500);
})
}
}
});
有没有其他方法可以使用我未包含的AngularJS的某些功能来简化这一点?
答案 0 :(得分:6)
请查看这个要点,https://gist.github.com/EpokK/5884263
您只需创建一个指令ng-enter
并将您的操作作为参数传递
app.directive('ngEnter', function() {
return function(scope, element, attrs) {
element.bind("keydown keypress", function(event) {
if(event.which === 13) {
scope.$apply(function(){
scope.$eval(attrs.ngEnter);
});
event.preventDefault();
}
});
};
});
HTML
<input ng-enter="myControllerFunction()" />
您可以将名称ng-enter
更改为其他名称,因为ng-**
是Angular核心团队保留的。
另外我看到你的控制器正在处理DOM,你不应该。将这些逻辑移动到其他指令或HTML,并使控制器保持精简状态。
if (ts.test.userTestId) {
btn = document.getElementById('viewQuestions'); //NOT in controller
} else {
btn = document.getElementById('acquireTest'); //NOT in controller
}
$timeout(function () {
btn.focus(); //NOT in controller
btn.click(); //NOT in controller
window.setTimeout(function () { // $timeout in $timeout, questionable
btn.blur(); //NOT in controller
}, 500);
})
答案 1 :(得分:2)
我过去所做的是一个指令,它只是监听输入键输入,然后执行一个类似于ng-click的功能。这使逻辑保留在控制器中,并允许跨多个元素重用。
//directive
angular.module('yourModule').directive('enterHandler', [function () {
return{
restrict:'A',
link: function (scope, element, attrs) {
element.bind("keydown keypress", function (event) {
var key = event.which ? event.which : event.keyCode;
if (key === 13) {
scope.$apply(function () {
scope.$eval(attrs.enterHandler);
});
event.preventDefault();
}
});
}
}
}]);
然后您的控制器变为
$scope.eventHandler = function(){
if (ts.test.current) {
var btn = ts.test.userTestId
? document.getElementById('viewQuestions')
: document.getElementById('acquireTest');
$timeout(function () {
btn.focus();
btn.click();
window.setTimeout(function () {
btn.blur();
}, 500);
})
}
}
然后您的标记可以
<div enter-handler="eventHandler()" ></div>