2015-05-08 7 views
10

È possibile ignorare o non consentire interruzioni di riga in un'area di testo in angularjs? Il testo è utilizzato in un generatore di PDF e non voglio che l'utente sia in grado di digitare una nuova riga quindi non vederla nel pdf. Preferirei che la chiave di ritorno fosse ignorata tutti insieme.Come rendere textarea non consentire o ignorare interruzione di riga/newline/return in AngularJS

<textarea ng-model="model.text"></textarea> 
+1

Che cosa vuoi dire? È già ignorato [(esempio)] (http://jsbin.com/navogicixi/1/edit?html,js,output) - aggiungi interruzioni di riga, l'output è ancora una riga. – Tom

+0

@Tom ci sono ancora caratteri di nuova riga lì, semplicemente non li mostra. Sto usando il testo in uno script php server lato server e stampa le nuove righe. Speravo solo di non permettere che i caratteri di nuova riga (non li mostrassero nella textarea) l'utente non crede di poter avere una nuova riga. –

risposta

4

Utilizzando Gísli Konrad e risposte midhunsezhi sono stato in grado di mettere insieme una direttiva che ha fatto quello che voglio. Il merito dovrebbe andare davvero a loro.

.directive('noNewLines', function() { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function(scope, element, attributes, ngModelController) { 
      var model = attributes.ngModel; 
      var regex = new RegExp("^[^\n\r]*$"); 

      // $parsers handle input from the element where the 
      // ng-model directive is set 
      ngModelController.$parsers.unshift(function(value) { 
       if(!value) return value; 
       var modelValue = ngModelController.$modelValue; 
       var isValid = regex.test(value); 
       ngModelController.$setValidity('Does not match pattern', isValid); 

       var transformedInput = value.replace(/[\n\r]/g, ''); 
       if(transformedInput !== value) { 
        ngModelController.$setViewValue(transformedInput); 
        ngModelController.$render(); 
       } 
       return transformedInput; 
      }); 

      // $formatters handle when the model is changed and 
      // the element needs to be updated 
      ngModelController.$formatters.unshift(function(value) { 
       if(!value) return value; 
       var isValid = regex.test(value); 
       ngModelController.$setValidity('Does not match pattern', isValid); 
       return value; 
      }); 

      element.on('keypress', function(e) { 
       var char = String.fromCharCode(e.which); 
       var text = angular.element(e.srcElement).val(); 
       if(!regex.test(char) || !regex.test(text)) { 
        event.preventDefault(); 
       }     
      }); 

     } 
    }; 
}); 

Ed è usato in questo modo:

<textarea ng-model="text" no-new-lines></textarea> 
6

nel controller/direttiva se si esegue una regex per rimuovere tutte le occorrenze di '\ n' in $scope.model.text, si dovrebbe ottenere una stringa pianura senza caratteri di nuova riga.

è possibile fare riferimento a questa risposta per farlo: How to replace all occurrences of a string in JavaScript?

Se non si vuole anche l'area di testo per avere qualche interruzioni di riga è possibile aggiungere la logica di cui sopra in un osservatore come questo:

$scope.$watch('model.text', function(){ 
    $scope.model.text = $scope.model.text.replace(/\n/g, ''); 
}) 
+1

Funzionerebbe e ho pensato di farlo ma non voglio che l'utente pensi di poter utilizzare le newline e quindi non vederle nel prodotto finale. Preferirei semplicemente non permettere loro di digitare una newline. –

+0

Ho modificato la risposta anche per l'area di testo per non avere interruzioni di riga (usando l'osservatore). L'utente ora ottiene ciò che vede nell'area di testo. :) – midhunsezhi

+0

Bello! Funziona a meno che tu non aggiunga una nuova riga alla fine della textarea e quindi non spari il $ watch. Non sono sicuro del perché ... Penso che per impostazione predefinita, il ritaglio angolare del testo nella textarea non cambi il modello e non spari il $ watch. –

-1

Utilizzare <input anziché <textarea e impostare l'altezza come textarea.

input.textarea { 
 
    height: 100px; 
 
    
 
    word-break: break-word; 
 
    width: 300px; 
 
}
<input class="textarea">

+0

Ottima idea. L'ho provato ed è molto vicino. Funziona tranne che il testo è allineato verticalmente nel mezzo di '' 'input''' che non corrisponde allo stile' 'textarea'''. Qualche modo per sistemarlo in modo che il testo sia allineato verticalmente? –

+0

Questa non è una risposta corretta perché la casella di input non può avvolgere il testo. Quindi non funzionerà come previsto. Puoi allineare il testo in alto in css, ma avrai sempre solo una riga di testo. che andrà in overflow una volta raggiunta la fine della casella di input. –

1

Ecco una direttiva che è possibile utilizzare. Ha opzioni per bloccare l'input non valido e per ignorare il caso.

.directive('taPattern', function() { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function(scope, element, attributes, ngModelController) { 
      var pattern = attributes.taPattern; 
      var flag = attributes.taPatternIgnoreCase === true ? 'i' : undefined; 
      var blockInvalidInput = attributes.hasOwnProperty('taPatternBlockInvalid'); 
      var model = attributes.ngModel; 
      if(!pattern) return; 
      if(pattern[0] != '^') 
       pattern = '^' + pattern; 
      if(pattern[pattern.length - 1] != '$') 
       pattern += '$'; 

      var regex = new RegExp(pattern, flag); 

      // $parsers handle input from the element where the 
      // ng-model directive is set 
      ngModelController.$parsers.unshift(function(value) { 
       if(!value) return value; 
       var modelValue = ngModelController.$modelValue; 
       var isValid = regex.test(value); 
       ngModelController.$setValidity('Does not match pattern', isValid); 
       return value; 
      }); 

      // $formatters handle when the model is changed and 
      // the element needs to be updated 
      ngModelController.$formatters.unshift(function(value) { 
       if(!value) return value; 
       var isValid = regex.test(value); 
       ngModelController.$setValidity('Does not match pattern', isValid); 
       return value; 
      }); 

      if(blockInvalidInput){      
       element.on('keypress', function(e) { 
        var char = String.fromCharCode(e.which); 
        var text = angular.element(e.srcElement).val(); 
        if(!regex.test(char) || !regex.test(text)) { 
         event.preventDefault(); 
        }     
       }); 
      } 

     } 
    }; 
}); 

Si può vedere una demo di qui: https://jsfiddle.net/mr59xf3z/3/

+0

Fantastico! La migliore risposta ancora! Funziona alla grande tranne quando copi e incolli il testo che ha un carattere di nuova riga.Può essere risolto usando @midhunsezhi '' '$ watch()' '' soluzione in tandem con questa direttiva, ma preferirei non utilizzare due soluzioni, in alcun modo per filtrare le nostre newline quando le copi? –

Problemi correlati