Angular.js: NgModelには、フォーマッタチェーンを手動で再実行する方法が必要です

作成日 2013年07月31日  ·  3コメント  ·  ソース: angular/angular.js

このフィドルを参照してください:
http://jsfiddle.net/tPWBK/1/

'ngModel'を必要とし、フォーマッターチェーンとパーサーチェーンに追加するデータ変換ディレクティブがあるとします。 変換が$ modelValueまたは$ viewValue以外の動的データに依存している場合、そのデータを監視してフォーマッターチェーンを再実行する方法はありません。

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

(ctrl。$ modelValue!== value)チェック内のすべてが、NgModelControllerで公開されている関数である必要がありますか?

forms feature

最も参考になるコメント

+1はこれがあれば本当にいいでしょう。 非同期フォーマッターとパーサーがないため、非同期データの操作はかなり厄介です。 これは、非同期データソースに対する同期検証によって発生する競合状態の一部を防ぐのに役立ちます。

参考までに、 @ jpsimonsと非常によく似てい

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

全てのコメント3件

そうですね、そのブロックをディレクティブにコピーするだけでよいと思います。 それはすべて公開のものです。 しかし、あなたのためにそれを行う機能を持っていると便利でしょう。

+1はこれがあれば本当にいいでしょう。 非同期フォーマッターとパーサーがないため、非同期データの操作はかなり厄介です。 これは、非同期データソースに対する同期検証によって発生する競合状態の一部を防ぐのに役立ちます。

参考までに、 @ jpsimonsと非常によく似てい

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

誰かがコードスニペットを検索している場合-それは移動しました:
https://github.com/angular/angular.js/blob/master/src/ng/directive/ngModel.js#L822

このページは役に立ちましたか?
0 / 5 - 0 評価