Angular.js: NgModel нужен способ вручную повторно запустить цепочку форматирования

Созданный на 31 июл. 2013  ·  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 рейтинги