Angularjs: как «перезапустить» $ formatters при изменении некоторых настроек?

#angularjs

#angularjs

Вопрос:

Настройка формата даты находится в области видимости.

Он используется фильтрами для отображения дат в label и директивой, помещающей функцию в $formatters из ngModel для форматирования даты во входных данных.

При изменении настройки формата в области видимости дата, отображаемая через фильтры, обновляется angular.

Но не поля ввода через $ formatters.

Единственный способ принудительно обновить это, который мы нашли, — установить для всех полей значение null, затем в $ timeout сбросить их до значения для отображения, чтобы принудительно выполнить повторное выполнение $ formatters.

Есть ли лучший способ сделать это?

Ответ:

Объединив ответ от Сергея Моисеева и ответ на 11380866, я смог добавить удовлетворяющее решение в директиву.

Сохраните настройки в rootscope (как это используется во многих директивах в ограниченной области) и реагируйте на это с помощью общего кода:

 $rootScope.$watch('userSettings.dateFormat.fmt', function (newVal, oldVal, scope) {
                if (newVal != oldVal) {
                    var viewValue = ngModelCtrl.$modelValue;
                    for (var i in ngModelCtrl.$formatters) {
                        viewValue = ngModelCtrl.$formatters[i](viewValue);
                    }
                    ngModelCtrl.$viewValue = viewValue;
                    ngModelCtrl.$render();
                }
            });
  

Спасибо!

Комментарии:

1. Можем ли мы увидеть ваш код? Довольно сложно понять, что вы делаете без этого.

2. github.com/angular/angular.js/issues/3407

3. Это здорово. Обратите внимание, что ваша скрипка работает, добавляя этот код в ваши часы: code var viewValue = ngModel.$modelValue; для (var i в ctrl.$formatters) { viewValue = ngModel.$formatters[i](viewValue); } ngModel.$viewValue = viewValue; ngModel.$render();