javascript - angular 在输入字段上的 $parsers 在初始输入时遇到困难

标签 javascript angularjs regex angularjs-directive

我在下面有完整工作元素的 plunker 链接

http://plnkr.co/edit/Q1iZwBp6LXlun4yHs7Dq?p=preview

这里只是一个简短的代码片段,可以跟随我的问题

var view_value;
function fromUser(text) {

    var return_value;

    if(text.match(pattern) === null){
    // if input is not the regex

    return_value = view_value;
    // alert("pattern not matched we need to reset input \nreturn value: " + return_value + "\nview_value: " + view_value);
    ngModelCtrl.$setViewValue(view_value);
    ngModelCtrl.$render();
    }
    else{
        //  alert("pattern matched we need to continue \nreturn value: " + return_value + "\nview_value: " + view_value);
        return_value = text;
        view_value = return_value;
    }

    return return_value;
    // if your return value is same as initial passin then it ends
}
ngModelCtrl.$parsers.push(fromUser);
// parser gets fired when UI updates

基本上我有一个输入字段,我也有一个正则表达式模式,当输入某些内容时,我检查这个正则表达式模式,如果它无效,那么我返回到最后一个已知的有效状态,这意味着 UI 更新。因此,无法将不属于我的正则表达式的无效字符或字符输入到我的输入中。只要您输入的第一个元素是有效字符(例如数字),这一切都可以正常工作。然后您可以输入无效或有效的输入,并且它可以正常工作以防止错误输入并允许正确输入。所以唯一的问题是当第一个数字是无效字符时,比如“a”,那么输入不会被重置。这是因为我还没有最后一个有效状态。似乎只设置我的 var view_value = ""; 是显而易见的。然而,这会造成无限循环。

所以重申一下,我的输入只允许带小数点最多 4 位的正数。如果我输入 4 然后 a 它将删除 a,我可以有 42.44335 并且它删除 5 等所以如果我第一次输入数字它就可以工作。但是,如果我以 a 之类的数字开头,它应该删除 a,这样输入将再次为空,但它不会这样做,所以我只在第一个初始输入时遇到问题。

我该如何解决这个问题?

最佳答案

当第一个字符不是数字时,这解决了您的问题,同时还对您的代码进行了最少数量的更改:

app.directive('inputRestrictor', [function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attr, ngModelCtrl) {
            // changed here
            var pattern = /^(?:|(?:[0-9]+(?:\.[0-9]{0,4})?))$/g;
            var view_value;

            function fromUser(text) {
                var return_value;
                if (text.match(pattern) === null) {
                    return_value = view_value;
                    // changed here
                    ngModelCtrl.$setViewValue(view_value || '');
                    ngModelCtrl.$render();
                }
                else {
                    return_value = text;
                    view_value = return_value;
                }

                return return_value;
            }
            ngModelCtrl.$parsers.push(fromUser);
        }
    };
}]);

关于javascript - angular 在输入字段上的 $parsers 在初始输入时遇到困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35374806/

相关文章:

python - Pandas 用正则表达式将列表分成几列

javascript - Node.js 和 MongoDB 无法规范化查询

javascript - VB.net Geckofx 45 执行 jquery.hide() 没有效果

javascript - 在两个 HTML 文件之间交换正文标签

javascript - Angular + RequireJs : Resolve templateUrls of directives

php - PHP pcre正则表达式中的命名组

javascript - 将二维数组转换为多行对象

angularjs - 带有 AngularJS 标签的 VisualForce 页面

javascript - Angular js - 无法推送到数组

Python正则表达式,忽略字符直到某个字符匹配多次