Как повторно проверить сразу при изменении регулярного выражения, используемого ngPattern

Скажем, у меня есть текстовое поле, проверенное ngPattern, которое в настоящее время действительно. Теперь я меняю регулярное выражение на то, которое не соответствует значению текстового поля. Angular не сразу понимает, что текстовое поле теперь недействительно - пользователь должен внести изменение (например, ввести другую букву), чтобы вызвать проверку нового регулярного выражения.

Обходной путь состоит в том, чтобы заставить конвейер синтаксического анализа запускаться, устанавливая $viewValue на себя всякий раз, когда изменяется регулярное выражение, например:

Просмотреть

<div ng-form="form">
    <input type="text" name="val" ng-model="myValue" ng-pattern="myRegex" />
</div>

Контроллер

// set a new regex for the ng-pattern directive and force re-validation
$scope.myRegex = new RegExp('^[a-z]$');
$scope.form.val.$setViewValue($scope.form.val.$viewValue); // yuck 

Тем не менее, это похоже на большой взлом, и я надеюсь, что есть более удобный способ сделать это, не прибегая к пользовательской директиве.

Скрипт: http://jsfiddle.net/5jm2V/2/


person Mike Chamberlain    schedule 04.06.2014    source источник


Ответы (1)


До сих пор я обходил это очевидное ограничение, перемещая вызов $setViewValue в директиву, которая, по крайней мере, придерживается принципа, согласно которому контроллеры не должны заниматься представлениями:

// Causes immediate re-validation of the model when ngPattern's regex is changed,
// rather than waiting for the user to manually change the value.
myModule.directive('ngPatternImmediate', [
    function() {
        return {
            require: 'ngModel',
            link: function(scope, elm, attrs, ngModelCtrl) {

                scope.$watch(function() {
                    // watch for change of regex
                    return scope.$eval(attrs.ngPattern);
                }, function() {
                    // force parsing pipeline to run
                    ngModelCtrl.$setViewValue(ngModelCtrl.$viewValue);
                });
            }
        };
    }
]);

Затем его можно использовать следующим образом:

<input type="text" ng-model="myValue" ng-pattern="myRegex" ng-pattern-immediate />

Мне все еще интересно, есть ли лучший способ сделать это.

person Mike Chamberlain    schedule 04.06.2014