【问题标题】:Blur an input field on keypress enter on Angular在Angular上的按键输入模糊输入字段
【发布时间】:2015-01-29 19:06:09
【问题描述】:

我发现this question 在有人按下“回车”键时提交表单非常有用:

Javascript:

angular.module('yourModuleName').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': event});
                });

                event.preventDefault();
            }
        });
    };
});

HTML:

<div ng-app="" ng-controller="MainCtrl">
    <input type="text" ng-enter="doSomething()">    
</div>

我想知道的是,当按下“enter”键时,将字段设置为模糊。 doSomething() 看起来会模糊发件人字段吗?

我想保留 ngEnter 指令的原样,因为我想将它重新用于其他功能。

更新: 我知道我可以为模糊创建一个完整的指令(这就是我现在的方式),但我想做的是能够做这样的事情:

<input type="text" ng-enter="this.blur()">

或者如何将当前元素作为参数传递?

<input type="text" ng-enter="doBlur(this)">

【问题讨论】:

标签: angularjs blur


【解决方案1】:

对于 Angular 2+

<input ... (keydown.enter)='$event.target.blur()'>

【讨论】:

  • 这需要更多的支持,因为 angular 2+ 可能正在超越 angularjs。
【解决方案2】:

SoluableNonagon 非常接近它。你只需要使用正确的论点。该指令将事件参数声明为event 而不是$event。您可以将指令更改为使用$event,就像ngClick 一样(或者您保留它并将其用作ng-enter="doSomething(event)"。

angular.module("app", [])
  .controller('MainController', MainController)
  .directive('myEnter', myEnter);

function MainController() {
  var vm = this;
  vm.text = '';
  vm.enter = function($event) {
    $event.target.blur();
    vm.result = vm.text;
    vm.text = '';
  }
}

myEnter.$inject = ['$parse'];

function myEnter($parse) {
  return {
    restrict: 'A',
    compile: function($element, attr) {
      var fn = $parse(attr.myEnter, null, true);
      return function(scope, element) {
        element.on("keydown keypress", function(event) {
          if (event.which === 13) {
            
            // This will pass event where the expression used $event
            fn(scope, { $event: event });
            scope.$apply();
            event.preventDefault();
          }
        });
      };
    }
  };
}
<script src="https://code.angularjs.org/1.4.8/angular.js"></script>

<div ng-app="app" ng-controller="MainController as view">
  <input my-enter="view.enter($event)" ng-model="view.text">
  <div ng-bind="view.result"></div>
</div>

【讨论】:

    【解决方案3】:

    在尝试了一堆东西之后,这似乎是不可能的,因为你需要通过 $event 来获取目标元素,所以单独的指令似乎是唯一的方法:

    我们想要什么:

    你不能传递this,因为它是指作用域,所以你需要传递事件。

    <input type="text" ng-enter="doBlur($event)">
    

    一旦有了事件,就可以从中获取目标。

    $scope.doBlur = function($event){
        var target = $event.target;
    
        // do more here, like blur or other things
        target.blur();
    }
    

    但是,你只能在像 ng-click 这样的指令中获得 pass 事件……有点不满意。如果我们可以将 $event 传递给外部指令,我们就可以按照您要求的可重用方式进行模糊处理。

    【讨论】:

    • 我不想这么说,但在这种情况下,jQuery 似乎更容易使用
    • 此解决方案仅在我按照以下代码行传递事件参数时才对我有效:scope.$eval(attrs.ngEnter, {'event': event});。非常感谢。
    • 在 Chrome 中运行良好,但在 Firefox 和 Edge 中失去了焦点。保持专注:target.focus()
    • @SoluableNonagon React 也有比这更优雅的方法。你不需要 jQuery。您只需要一个专为 Web 而非 Java 应用程序设计的框架。
    猜你喜欢
    • 2014-09-30
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多