Angular.js: NgModel necesita una forma de volver a ejecutar manualmente la cadena del formateador

Creado en 31 jul. 2013  ·  3Comentarios  ·  Fuente: angular/angular.js

Mira este violín:
http://jsfiddle.net/tPWBK/1/

Supongamos que tiene una directiva de transformación de datos que requiere 'ngModel' y se agrega a las cadenas del formateador y analizador. Si la transformación depende de algunos datos dinámicos distintos de $ modelValue o $ viewValue, no hay forma de vigilar esos datos y volver a ejecutar la cadena del formateador.

Vea este extracto de https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L1081

$scope.$watch(function ngModelWatch() {
  var value = ngModelGet($scope);

  // if scope model value and ngModel value are out of sync
  if (ctrl.$modelValue !== value) {

    var formatters = ctrl.$formatters,
        idx = formatters.length;

    ctrl.$modelValue = value;
    while(idx--) {
      value = formatters[idx](value);
    }

    if (ctrl.$viewValue !== value) {
      ctrl.$viewValue = value;
      ctrl.$render();
    }
  }
});

¿Debería todo lo que está dentro de la verificación (ctrl. $ ModelValue! == value) ser una función que se expone públicamente en NgModelController?

forms feature

Comentario más útil

+1 sería muy bueno tener esto. la falta de formateadores y analizadores asíncronos hace que trabajar con datos asíncronos sea bastante desagradable. esto ayudaría a prevenir algunas de las condiciones de carrera introducidas por la validación síncrona contra una fuente de datos asíncrona.

como referencia, lo hice de manera muy similar a @jpsimons :

scope.$watch('myAsyncCollection', () => {
  ngModel.$viewValue = ngModel.$formatters.reduceRight((prev, fn) => fn(prev)), ngModel.$modelValue)
  ngModel.$render()
})

Todos 3 comentarios

Bueno, supongo que uno podría simplemente copiar ese bloque en una directiva. Todo es cosa pública. Sin embargo, sería útil tener una función para hacerlo por usted.

+1 sería muy bueno tener esto. la falta de formateadores y analizadores asíncronos hace que trabajar con datos asíncronos sea bastante desagradable. esto ayudaría a prevenir algunas de las condiciones de carrera introducidas por la validación síncrona contra una fuente de datos asíncrona.

como referencia, lo hice de manera muy similar a @jpsimons :

scope.$watch('myAsyncCollection', () => {
  ngModel.$viewValue = ngModel.$formatters.reduceRight((prev, fn) => fn(prev)), ngModel.$modelValue)
  ngModel.$render()
})

solo si alguien está buscando el fragmento de código, se ha movido:
https://github.com/angular/angular.js/blob/master/src/ng/directive/ngModel.js#L822

¿Fue útil esta página
0 / 5 - 0 calificaciones