En Angular, podría tener una forma similar a esta:
<ng-form>
<label>First Name</label>
<input type="text" ng-model="model.first_name">
<label>Last Name</label>
<input type="text" ng-model="model.last_name">
</ng-form>
Dentro del controlador correspondiente, podría observar fácilmente los cambios en el contenido de ese formulario de la siguiente manera:
function($scope) {
$scope.model = {};
$scope.$watch('model', () => {
// Model has updated
}, true);
}
Aquí hay un ejemplo angular en JSFiddle .
Tengo problemas para descubrir cómo lograr lo mismo en Angular. Obviamente, ya no tenemos $scope
$ rootScope. ¿Seguramente hay un método por el cual se puede lograr lo mismo?
Aquí hay un ejemplo angular en Plunker .
(ngModelChange)="onModelChange($event)"
atributo a cada entrada de formulario para lograr esto?Respuestas:
UPD La respuesta y la demostración se actualizan para alinearse con la última versión angular.
Puede suscribirse a cambios de formulario completos debido al hecho de que FormGroup que representa un formulario proporciona una
valueChanges
propiedad que es una instancia observable:En este caso, necesitaría construir el formulario manualmente usando FormBuilder . Algo como esto:
Echa un vistazo
valueChanges
en acción en esta demostración : http://plnkr.co/edit/xOz5xaQyMlRzSrgtt7Wn?p=previewfuente
valueChanges
emisor de sucesos si esa forma se define únicamente dentro de la plantilla? En otras palabras, dentro del constructor de un componente, ¿no es posible obtener una referencia a un formulario que se definió únicamente dentro de la plantilla de ese componente y no con la ayuda de FormBuilder?@ViewChild()
. Ver mi respuesta actualizada.Si está utilizando
FormBuilder
, vea la respuesta de @ dfsq.Si no está utilizando
FormBuilder
, hay dos formas de ser notificado de los cambios.Método 1
Como se discutió en los comentarios sobre la pregunta, use un enlace de evento en cada elemento de entrada. Añadir a su plantilla:
Luego en su componente:
La página Formularios tiene información adicional sobre ngModel que es relevante aquí:
En su caso, supongo que quiere hacer algo especial.
Método 2
Defina una variable de plantilla local y configúrela en
ngForm
.Use ngControl en los elementos de entrada.
Obtenga una referencia a la directiva NgForm del formulario utilizando @ViewChild, luego suscríbase al ControlGroup de NgForm para ver los cambios:
plunker
Para obtener más información sobre el Método 2, vea el video de Savkin .
Consulte también la respuesta de @ Thierry para obtener más información sobre lo que puede hacer con lo
valueChanges
observable (como eliminar el rebote / esperar un poco antes de procesar los cambios).fuente
Para completar un poco más de excelentes respuestas anteriores, debe tener en cuenta que los formularios aprovechan los observables para detectar y manejar los cambios de valor. Es algo realmente importante y poderoso. Tanto Mark como dfsq describieron este aspecto en sus respuestas.
Los observables permiten no solo usar el
subscribe
método (algo similar althen
método de promesas en Angular 1). Puede ir más allá si es necesario para implementar algunas cadenas de procesamiento de datos actualizados en formularios.Quiero decir que puede especificar a este nivel el tiempo de rebote con el
debounceTime
método. Esto le permite esperar una cantidad de tiempo antes de manejar el cambio y manejar correctamente varias entradas:También puede conectar directamente el procesamiento que desea activar (algunos asincrónicos, por ejemplo) cuando se actualizan los valores. Por ejemplo, si desea manejar un valor de texto para filtrar una lista basada en una solicitud AJAX, puede aprovechar el
switchMap
método:Incluso va más allá al vincular el observable devuelto directamente a una propiedad de su componente:
y mostrarlo usando la
async
tubería:Solo para decir que necesitas pensar la forma de manejar formas de manera diferente en Angular2 (una forma mucho más poderosa ;-)).
Espero que te ayude, Thierry
fuente
Ampliando las sugerencias de Mark ...
Método 3
Implemente la detección de cambios "profundos" en el modelo. Las ventajas implican principalmente evitar la incorporación de aspectos de la interfaz de usuario en el componente; Esto también capta los cambios programáticos realizados en el modelo. Dicho esto, requeriría un trabajo adicional para implementar cosas tales como eliminar el rebote según lo sugerido por Thierry, y esto también detectará sus propios cambios programáticos, así que úselo con precaución.
Probar en Plunker
fuente
Para
5+
versión angular . Poner la versión ayuda ya que angular hace muchos cambios.fuente
Pensé en usar el método (ngModelChange), luego pensé en el método FormBuilder y finalmente decidí una variación del Método 3. Esto ahorra la decoración de la plantilla con atributos adicionales y recoge automáticamente los cambios en el modelo, reduciendo la posibilidad de olvidar algo. con el Método 1 o 2.
Simplificando el Método 3 un poco ...
Puede agregar un tiempo de espera para llamar solo a doSomething () después de x número de milisegundos para simular un rebote.
fuente