369

この特定のケースでは、Enter キーを押したときにこれらの入力が関数を呼び出すようにするには、どのようなオプションが必要ですか?

HTML:

<form>
    <input type="text" ng-model="name" <!-- Press ENTER and call myFunc --> />
    <br />
    <input type="text" ng-model="email" <!-- Press ENTER and call myFunc --> />
</form>
// Controller //
.controller('mycontroller', ['$scope',function($scope) {
    $scope.name = '';
    $scope.email = '';
    // Function to be called when pressing ENTER
    $scope.myFunc = function() {
       alert('Submitted');
    };
}])
4

12 に答える 12

523

Angularはこれをすぐにサポートします。フォーム要素でngSubmitを試しましたか?

<form ng-submit="myFunc()" ng-controller="mycontroller">
   <input type="text" ng-model="name" />
    <br />
    <input type="text" ng-model="email" />
</form>

編集:送信ボタンに関するコメントごとに、送信ボタンなしでEnterキーを押してフォームを送信するを参照してください。これにより、次の解決策が得られます。

<input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;"/>

非表示の送信ボタンソリューションが気に入らない場合は、コントローラー関数をEnterキープレスまたはキーアップイベントにバインドする必要があります。これには通常、カスタムディレクティブが必要ですが、AngularUIライブラリにはすでに優れたキープレスソリューションが設定されています。http://angular-ui.github.com/を参照してください

angleUI libを追加すると、コードは次のようになります。

<form ui-keypress="{13:'myFunc($event)'}">
  ... input fields ...
</form>

または、Enterキーを押して個々のフィールドにバインドすることもできます。

また、単純なkeypresディレクティブを作成するためのこのSOの質問を参照してください: AngularJSでonKeyUpを検出するにはどうすればよいですか?

編集(2014-08-28):この回答が書かれた時点では、ng-keypress / ng-keyup/ng-keydownはAngularJSのネイティブディレクティブとして存在していませんでした。以下のコメントでは、@darlan-alvesには次のようなかなり良い解決策があります。

<input ng-keyup="$event.keyCode == 13 && myFunc()"... />

于 2013-03-14T19:05:41.050 に答える
289

フォームなしで関数を呼び出したい場合は、私の ngEnter ディレクティブを使用できます。

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>

TwitterGist アカウントで他の素晴らしいディレクティブを送信します。

于 2013-06-28T12:25:52.123 に答える
201

入力が 1 つしかない場合は、form タグを使用できます。

<form ng-submit="myFunc()" ...>

入力が複数ある場合、フォームタグを使用したくない場合、または特定のフィールドにエンターキー機能を追加したい場合は、次のように特定の入力にインライン化できます。

<input ng-keyup="$event.keyCode == 13 && myFunc()" ...>
于 2014-02-03T18:34:57.283 に答える
33

与えられた答えよりももう少し拡張性/セマンティックなものが欲しかったので、ビルトインと同様の方法で JavaScript オブジェクトを取るディレクティブを書きましたngClass:

HTML

<input key-bind="{ enter: 'go()', esc: 'clear()' }" type="text"></input>

オブジェクトの値は、ディレクティブのスコープのコンテキストで評価されます - それらが一重引用符で囲まれていることを確認してください。そうしないと、ディレクティブがロードされたときにすべての関数が実行されます(!)

たとえば、次 esc : 'clear()'のようにします。esc : clear()

Javascript

myModule
    .constant('keyCodes', {
        esc: 27,
        space: 32,
        enter: 13,
        tab: 9,
        backspace: 8,
        shift: 16,
        ctrl: 17,
        alt: 18,
        capslock: 20,
        numlock: 144
    })
    .directive('keyBind', ['keyCodes', function (keyCodes) {
        function map(obj) {
            var mapped = {};
            for (var key in obj) {
                var action = obj[key];
                if (keyCodes.hasOwnProperty(key)) {
                    mapped[keyCodes[key]] = action;
                }
            }
            return mapped;
        }
        
        return function (scope, element, attrs) {
            var bindings = map(scope.$eval(attrs.keyBind));
            element.bind("keydown keypress", function (event) {
                if (bindings.hasOwnProperty(event.which)) {
                    scope.$apply(function() {
                         scope.$eval(bindings[event.which]);
                    });
                }
            });
        };
    }]);
于 2014-02-19T13:35:22.193 に答える
28

別のアプローチは、 ng-keypress を使用することです。

<input type="text" ng-model="data" ng-keypress="($event.charCode==13)? myfunc() : return"> 

AngularJS で Enter キーを押して入力を送信する - jsfiddle

于 2016-10-21T05:18:39.940 に答える
14

shift + enter サポートを備えた非常に優れた、クリーンでシンプルなディレクティブ:

app.directive('enterSubmit', function () {
    return {
        restrict: 'A',
        link: function (scope, elem, attrs) {
            elem.bind('keydown', function(event) {
                 var code = event.keyCode || event.which;
                 if (code === 13) {
                       if (!event.shiftKey) {
                            event.preventDefault();
                            scope.$apply(attrs.enterSubmit);
                       }
                 }
            });
        }
    }
});
于 2015-02-02T20:52:06.123 に答える
5

データの検証も必要な場合

<!-- form -->
<form name="loginForm">
...
  <input type="email" ng-keyup="$loginForm.$valid && $event.keyCode == 13 && signIn()" ng-model="email"... />
  <input type="password" ng-keyup="$loginForm.$valid && $event.keyCode == 13 && signIn()" ng-model="password"... />
</form>

ここでの重要な追加は$loginForm.$valid、関数を実行する前にフォームを検証することです。この質問の範囲を超えている検証のために、他の属性を追加する必要があります。

幸運を。

于 2016-06-29T02:28:56.433 に答える
1

ng-submit を使用して、両方の入力を別々のフォーム タグでラップするだけです。

<div ng-controller="mycontroller">

  <form ng-submit="myFunc()">
    <input type="text" ng-model="name" <!-- Press ENTER and call myFunc --> />
  </form>

  <br />

  <form ng-submit="myFunc()">
    <input type="text" ng-model="email" <!-- Press ENTER and call myFunc --> />
  </form>

</div>

各入力フィールドを独自のフォーム タグでラップすると、ENTER でどちらのフォームでも送信を呼び出すことができます。両方に 1 つのフォーム タグを使用する場合は、送信ボタンを含める必要があります。

于 2014-11-18T05:25:36.310 に答える