我可以使用AngularJS简化点击回车键吗?

时间:2015-07-22 12:34:12

标签: angularjs

我已经提供了这个代码:

在我的外部控制器中:

    $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的某些功能来简化这一点?

2 个答案:

答案 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>