2014-12-05 20 views
10

Non voglio che un utente inserisca spazi in un campo di testo. Non voglio che invii la convalida, ma piuttosto: uno spazio non verrà visualizzato nel campo di testo quando lo fanno clic.restrizione angolare per non consentire spazi nel campo di testo

+0

Cosa hai provato fino ad ora? Ti suggerirei di scrivere una direttiva personalizzata che guardi keyCode su keydown e intraprenda le azioni appropriate. –

risposta

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

Aggiornamento: Per migliorare la qualità del codice è possibile invece creare direttive personalizzate. Ma non dimenticare che la tua direttiva dovrebbe impedire l'input non solo da tastiera, ma anche da incollare.

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

Qui è importante aggiungere l'attributo ng-trim = "falso" per disabilitare il taglio di un input.

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

Perché usare un 'split()' seguito da un 'join()' se si può usare invece un semplice 'replace()'? – PLPeeters

26

La risposta selezionata è probabilmente non molto unobtrusive. E se hai bisogno di usarlo in più posti, finirai con il codice duplicato.

Preferisco impedire l'immissione di spazi utilizzando la seguente direttiva.

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

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

Questa direttiva può essere invocato in questo modo:

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

Questa è una soluzione molto più pulita rispetto alla risposta selezionata. – GEMI

+1

Cosa accadrebbe se l'utente avesse incollato una stringa con spazi per un input? –

+1

@IlyaLuzyanin Buona domanda. La mia direttiva originale probabilmente non avrebbe funzionato in quel caso. Ho sostituito la mia risposta con una direttiva che tiene conto degli spazi incollati. –

2

della direttiva Jason ha scritto non ha funzionato per me. Ho dovuto cambiare return false a: e.preventDefault() in questo modo:

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

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

non riuscito a incollare il testo –

+0

vedo. Beh, questo funziona per prevenire caratteri speciali, forse è adattabile anche per non consentire spazi. Incollare non funzionerà qui: http://kopy.io/KNoU1 – Bento

1

Questo funziona per impedire di entrare eventuali caratteri speciali compresi gli spazi:

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

Se si vuole raggiungere è senza scrivere direttiva

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

Problemi correlati