2014-12-05 14 views
10

Ich möchte nicht, dass ein Benutzer Leerzeichen in ein Textfeld eingibt. Ich möchte es nicht bei der Validierung, sondern - ein Leerzeichen wird nicht auf dem Textfeld angezeigt, wenn es darauf klickt.Winkelbeschränkung, um keine Leerzeichen im Textfeld zuzulassen

+0

Was haben Sie bisher versucht? Ich würde vorschlagen, dass Sie eine benutzerdefinierte Anweisung schreiben, die keyCode auf Keydown überwacht und entsprechende Maßnahmen ergreift. –

Antwort

13
<input ng-model="field" ng-trim="false" ng-change="field = field.split(' ').join('')" type="text"> 

Update: um die Codequalität verbessern Sie benutzerdefinierte Richtlinie stattdessen erstellen können. Aber vergiss nicht, dass deine Anweisung die Eingabe nicht nur von der Tastatur, sondern auch vom Einfügen verhindern sollte.

<input type="text" ng-trim="false" ng-model="myValue" restrict-field="myValue"> 

ist es wichtig, ng-trim = "false" Attribut hinzufügen einem Eingang zu deaktivieren Trimmen.

angular 
    .module('app') 
    .directive('restrictField', function() { 
    return { 
     restrict: 'AE', 
     scope: { 
      restrictField: '=' 
     }, 
     link: function (scope) { 
      // this will match spaces, tabs, line feeds etc 
      // you can change this regex as you want 
      var regex = /\s/g; 

      scope.$watch('restrictField', function (newValue, oldValue) { 
       if (newValue != oldValue && regex.test(newValue)) { 
       scope.restrictField = newValue.replace(regex, ''); 
       } 
      }); 
     } 
    }; 
    }); 
+0

Warum sollten Sie '' split() 'gefolgt von' 'join()' verwenden, wenn Sie stattdessen ein einfaches 'replace()' verwenden können? – PLPeeters

26

Die ausgewählte Antwort ist wohl nicht sehr unobtrusive. Und wenn Sie es an mehreren Stellen verwenden müssen, erhalten Sie doppelten Code.

Ich bevorzuge die Eingabe von Leerzeichen mit der folgenden Direktive zu verhindern.

<input type="text" disallow-spaces> 
+4

Dies ist eine viel sauberere Lösung als die ausgewählte Antwort. – GEMI

+1

Was würde passieren, wenn der Benutzer eine Zeichenfolge mit Leerzeichen an eine Eingabe anfügt? –

+1

@IlyaLuzyanin Gute Frage. Meine ursprüngliche Richtlinie hätte in diesem Fall wahrscheinlich nicht funktioniert. Ich habe meine Antwort durch eine Direktive ersetzt, die berücksichtigt, dass Leerzeichen eingefügt werden. –

2

der Richtlinie Jason hat nicht funktioniert für mich schrieb:

app.directive('disallowSpaces', function() { 
    return { 
    restrict: 'A', 

    link: function($scope, $element) { 
     $element.bind('input', function() { 
     $(this).val($(this).val().replace(/ /g, '')); 
     }); 
    } 
    }; 
}); 

Diese Direktive kann wie folgt aufgerufen werden. Ich musste zurückkehren ändern falsch: e.preventDefault() wie folgt:

app.directive('disallowSpaces', function() { 
    return { 
     restrict: 'A', 

     link: function($scope, $element) { 
      $element.bind('keydown', function(e) { 
       if (e.which === 32) { 
        e.preventDefault(); 
       } 
      }); 
     } 
    } 
}); 
+0

beim Einfügen des Textes fehlgeschlagen –

+0

Ich sehe. Nun, das funktioniert, um spezielle Zeichen zu vermeiden, vielleicht ist es auch anpassungsfähig, um Räume zu sperren. Das Einfügen funktioniert hier nicht: http://kopy.io/KNoU1 – Bento

1

Dies funktioniert spezielles Zeichen einschließlich Leerzeichen verhindern eingeben:

app.directive('noSpecialChar', function() { 
return { 
    require: 'ngModel', 
    restrict: 'A', 
    link: function(scope, element, attrs, modelCtrl) { 
     modelCtrl.$parsers.push(function(inputValue) { 
      if (inputValue == null) 
       return '' 
      let cleanInputValue = inputValue.replace(/[^\w]|_/gi, ''); 
      if (cleanInputValue != inputValue) { 
       modelCtrl.$setViewValue(cleanInputValue); 
       modelCtrl.$render(); 
      } 
      return cleanInputValue; 
     }); 
    } 
} 
}); 
0

Wenn Sie sie erreichen wollen, ohne Richtlinie schreiben

ng-keydown="$event.keyCode != 32 ? $event:$event.preventDefault()"

Verwandte Themen