基于长度调用文本输入上的angularjs函数

时间:2015-05-15 18:08:53

标签: javascript html angularjs angularjs-ng-change

我有一个文本框。我想在用户在文本框中填写“n”或更多字符时调用控制器内的方法。

有人可以指点一下如何处理这个问题吗?

由于

5 个答案:

答案 0 :(得分:9)

我建议您只使用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>

答案 1 :(得分:6)

您可以使用ng-keyup指令

来实现此目的
ng-keyup="(1myNgModel.length >= n) && myFunction()"

只有当模型的长度大于等于n长度

时,才会调用所需的函数

http://xsltransform.net/bdxtqy

虽然更好的版本会有ng-model-options debounce时间,因此会减少值更改次数。之后,我们可以轻松地使用ng-change指令来触发函数。

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

Working Plunkr

答案 2 :(得分:2)

您可以向元素添加指令,并为模型更改添加$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 Example

答案 3 :(得分:1)

执行此操作的好方法是使用指令。以下是它的完成方式:

视图:

<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/

答案 4 :(得分:0)

如果你使用ngModel将输入字段绑定到一个变量,你可以使用$ watch或$ observe在控制器上观察它(不是很优雅),只要它改变,并检查长度。