Angular.js: NgModel benötigt eine Möglichkeit, die Formatierungskette manuell erneut auszuführen

Erstellt am 31. Juli 2013  ·  3Kommentare  ·  Quelle: angular/angular.js

Siehe diese Geige:
http://jsfiddle.net/tPWBK/1/

Angenommen, Sie haben eine Datentransformationsdirektive, die 'ngModel' erfordert und zu den Formatierer- und Parserketten hinzugefügt wird. Wenn die Transformation von anderen dynamischen Daten als $modelValue oder $viewValue abhängt, gibt es keine Möglichkeit, diese Daten zu überwachen und die Formatierungskette erneut auszuführen.

Siehe diesen Auszug aus 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();
    }
  }
});

Sollte alles in der Prüfung (ctrl.$modelValue !== value) eine Funktion sein, die öffentlich auf NgModelController verfügbar gemacht wird?

forms feature

Hilfreichster Kommentar

+1 wäre wirklich schön, das zu haben. das Fehlen asynchroner Formatierer und Parser macht die Arbeit mit asynchronen Daten ziemlich unangenehm. Dies würde dazu beitragen, einige der Racebedingungen zu verhindern, die durch die synchrone Validierung mit einer asynchronen Datenquelle eingeführt werden.

Als Referenz habe ich es sehr ähnlich wie @jpsimons gemacht :

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

Alle 3 Kommentare

Nun, ich denke, man könnte diesen Block einfach in eine Direktive kopieren. Es ist alles öffentliches Zeug. Wäre praktisch, eine Funktion zu haben, die dies für Sie erledigt.

+1 wäre wirklich schön, das zu haben. das Fehlen asynchroner Formatierer und Parser macht die Arbeit mit asynchronen Daten ziemlich unangenehm. Dies würde dazu beitragen, einige der Racebedingungen zu verhindern, die durch die synchrone Validierung mit einer asynchronen Datenquelle eingeführt werden.

Als Referenz habe ich es sehr ähnlich wie @jpsimons gemacht :

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

nur wenn jemand das Code-Snippet durchsucht - es hat sich verschoben:
https://github.com/angular/angular.js/blob/master/src/ng/directive/ngModel.js#L822

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen