Angular.js: NgModel a besoin d'un moyen de réexécuter manuellement la chaîne de formatage

Créé le 31 juil. 2013  ·  3Commentaires  ·  Source: angular/angular.js

Voir ce violon :
http://jsfiddle.net/tPWBK/1/

Supposons que vous ayez une directive de transformation de données qui nécessite 'ngModel' et s'ajoute aux chaînes du formateur et de l'analyseur. Si la transformation dépend de données dynamiques autres que $modelValue ou $viewValue, il n'y a aucun moyen de surveiller ces données et de réexécuter la chaîne de formatage.

Voir cet extrait 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();
    }
  }
});

Tout ce qui se trouve à l'intérieur de la vérification (ctrl.$modelValue !== value) doit-il être une fonction exposée publiquement sur NgModelController ?

forms feature

Commentaire le plus utile

+1 serait vraiment bien d'avoir ça. le manque de formateurs et d'analyseurs asynchrones rend le travail avec des données asynchrones assez désagréable. cela aiderait à éviter certaines des conditions de concurrence introduites par la validation synchrone par rapport à une source de données asynchrone.

pour référence, je l'ai fait de manière très similaire à @jpsimons :

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

Tous les 3 commentaires

Eh bien, je suppose que l'on pourrait simplement copier ce bloc dans une directive. C'est tout public. Ce serait pratique d'avoir une fonction pour le faire pour vous cependant.

+1 serait vraiment bien d'avoir ça. le manque de formateurs et d'analyseurs asynchrones rend le travail avec des données asynchrones assez désagréable. cela aiderait à éviter certaines des conditions de concurrence introduites par la validation synchrone par rapport à une source de données asynchrone.

pour référence, je l'ai fait de manière très similaire à @jpsimons :

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

juste si quelqu'un recherche l'extrait de code - il a bougé :
https://github.com/angular/angular.js/blob/master/src/ng/directive/ngModel.js#L822

Cette page vous a été utile?
0 / 5 - 0 notes