Tengo una entrada de texto y no quiero permitir que los usuarios usen espacios, y todo lo que se escriba se convertirá en minúsculas.
Sé que no puedo usar filtros en ng-model, por ejemplo.
ng-model='tags | lowercase | no_spaces'
Busqué crear mi propia directiva pero agregar funciones $parsers
y $formatters
no actualicé la entrada, solo otros elementos que tenía ng-model
.
¿Cómo puedo cambiar la entrada de la que estoy escribiendo actualmente?
Básicamente, estoy tratando de crear la función de 'etiquetas' que funciona igual que la aquí en StackOverflow.
angularjs
angularjs-filter
dom-manipulation
angularjs-ng-model
Andrew WC Brown
fuente
fuente
Respuestas:
Sugeriría ver el valor del modelo y actualizarlo al cambiar: http://plnkr.co/edit/Mb0uRyIIv1eK8nTg3Qng?p=preview
El único problema interesante es con los espacios: en AngularJS 1.0.3 ng-model en la entrada recorta automáticamente la cadena, por lo que no detecta que el modelo se cambió si agrega espacios al final o al inicio (por lo que mis espacios no se eliminan automáticamente código). Pero en 1.1.1 hay una directiva 'ng-trim' que permite deshabilitar esta funcionalidad ( commit ). Así que decidí usar 1.1.1 para lograr la funcionalidad exacta que describiste en tu pregunta.
fuente
$watch
obliga al oyente a ser invocado nuevamente. En casos simples (donde su filtro es idempotente), terminará con el filtro ejecutándose dos veces en cada modificación.Creo que la intención de las entradas de AngularJS y la
ngModel
direccional es que la entrada no válida nunca termine en el modelo . El modelo siempre debe ser válido. El problema con tener un modelo no válido es que podríamos tener observadores que disparen y tomen acciones (inapropiadas) basadas en un modelo no válido.Tal como lo veo, la solución adecuada aquí es conectarse a la
$parsers
tubería y asegurarse de que la entrada no válida no llegue al modelo. No estoy seguro de cómo trató de abordar las cosas o con qué no funcionó exactamente para usted,$parsers
pero aquí hay una directiva simple que resuelve su problema (o al menos mi comprensión del problema):Tan pronto como se declare la directiva anterior, se puede usar así:
Como en la solución propuesta por @Valentyn Shybanov, necesitamos usar la
ng-trim
directiva si queremos no permitir espacios al principio / al final de la entrada.La ventaja de este enfoque es doble:
fuente
modelCtrl.$setViewValue(transformedInput); modelCtrl.$render();
Útil sería un enlace a la documentación: docs.angularjs.org/api/ng.directive:ngModel.NgModelController Una palabra para "proteger" mi solución es que la propiedad del alcance podría cambiarse no solo desde las vistas y mi manera cubre esto. Así que creo que depende de una situación real cómo se podría modificar el alcance.modelCtrl
es el controlador requerido por la directiva. (require 'ngModel'
)Una solución a este problema podría ser aplicar los filtros en el lado del controlador:
$scope.tags = $filter('lowercase')($scope.tags);
No olvides declarar
$filter
como dependencia.fuente
Si está utilizando un campo de entrada de solo lectura, puede usar ng-value con filtro.
por ejemplo:
fuente
Use una directiva que se agregue a las colecciones $ formateadores y $ parsers para garantizar que la transformación se realice en ambas direcciones.
Consulte esta otra respuesta para obtener más detalles, incluido un enlace a jsfiddle.
fuente
Tuve un problema similar y usé
en mi controlador, llamo a un método del objectInScope para modificarse correctamente (entrada aproximada). En el controlador he iniciado en algún lugar que
Sé que esto no usa ningún filtro o observador sofisticado ... pero es simple y funciona muy bien. El único inconveniente de esto es que el objectInScope se envía en la llamada al controlador ...
fuente
Si está haciendo una validación de entrada compleja y asíncrona, puede valer la pena resumir
ng-model
un nivel como parte de una clase personalizada con sus propios métodos de validación.https://plnkr.co/edit/gUnUjs0qHQwkq2vPZlpO?p=preview
html
código
fuente
Puedes probar esto
fuente