web-dev-qa-db-ja.com

長さに基づいてテキスト入力でanglejs関数を呼び出す

テキストボックスがあります。ユーザーがテキストボックスに「n」個以上の文字を入力した場合にのみ、コントローラー内のメソッドを呼び出したいと思います。

誰かが私にこれにアプローチする方法についてのポインタを教えてもらえますか?

ありがとう

9
blue piranha

ngChange を使用し、評価関数にバインドすることをお勧めします。以下はサンプルです

angular.module('inputChange', [])
    .controller('TextInputController', ['$scope', function ($scope) {
    var inputMin = 3;
    $scope.someVal = '';
    $scope.result = '';
    $scope.textChanged = function() {
        if ($scope.someVal.length >= inputMin) executeSomething()
        else $scope.result = '';
    };

    function executeSomething() {
        $scope.result = $scope.someVal;
    };
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="inputChange" ng-controller="TextInputController">
    <input type="text" ng-model="someVal" ng-change="textChanged()" ng-Trim="false" /> 
    <br />

    someVal: <span ng-bind="someVal"></span>
    <br />
    Result: <span ng-bind="result"></span>
    <br />
    someVal Length: <span ng-bind="someVal.length"></span>
    <br />
    Result Length: <span ng-bind="result.length"></span>
</div>
9
Shadow3188

ng-keyupディレクティブを使用してこれを簡単に達成できます。

ng-keyup="(1myNgModel.length >= n) && myFunction()"

目的の関数は、モデルの長さがn length以上である場合にのみ呼び出されます

Working Plunkr


より良いバージョンは、debounce時間でng-model-optionsを持っているので、値の変更回数が減ります。その後、ng-changeディレクティブを使用して関数を起動できます。

<input type="text" ng-model="myNgModel" 
  ng-change="(myNgModel.length >= 3) && myFunction()" 
  ng-model-options="{ debounce: 200 }" />

更新されたデモ

6
Pankaj Parkar

要素にディレクティブを追加し、モデルを変更するために$watchを追加できます。その後、モデルが変更されて値を取得したときに、必要なロジックを起動できます。この場合、モデルをexpressionと呼びましょう。 <textarea>要素の例を次に示します。このアプローチは、<input />要素にも同様に使用できます。

<textarea watcher ng-model="expression"></textarea>

app.directive('watcher', [function () {
    return {
        restrict: 'A',
        link: function (scope, elem, attrs) {
            scope.$watch(attrs.ngModel, function (v) {
                if(v) {
                    // you have a value
                } else {
                    // no value
                }
            });
        }
    }
}]);

JSFiddleの例

2
scniro

これを行う良い方法は、ディレクティブを使用することです。その方法は次のとおりです。

見る:

<div ng-app="foo" ng-controller="fooController">
    <textarea text-length-handler="doThing()" text-length="6" ng-model="text">
    </textarea>
</div>

js:

angular.module('foo', [])
.directive('textLength', function(){
    return {
        restrict: 'A',
        require: 'ngModel',
        scope: {
            textLengthHandler: '&'
        },
        link: function ($scope, $element, $attrs, ctrl) {
            var limit = parseInt($attrs.textLength);
            var handler = function(){
                if (ctrl.$modelValue.length >= limit) {
                    $scope.textLengthHandler()
                }
            };
            $element.on('keypress', handler);
            // remove the handler when the directive disappears
            $scope.$on('destroy', function(){
                $element.off('keypress', handler)
            });
        }
    }
})

ここでフィドル:

http://jsfiddle.net/dtq0mz8m/

1
bioball

NgModelを使用して入力フィールドを変数に関連付けると、$ watchまたは$ observeが変更されるたびにコントローラーからそれを監視できますが(非常にエレガントではありません)、長さを確認できます。

0
Giliar Perez