Angularjs:如何;“重新运行”$更改某些设置时格式化程序?

Angularjs:如何;“重新运行”$更改某些设置时格式化程序?,angularjs,Angularjs,日期格式设置在范围内 它被过滤器用来在标签中显示日期,并被指令从ngModel将函数放入$formatters中,以格式化输入中的日期 当作用域中的格式设置更改时,通过过滤器显示的日期将由angular刷新 但不是通过$formatters输入字段 我们发现,强制刷新的唯一方法是将所有字段设置为null,然后在$timeout中将它们重置为要显示的值,以强制重新执行$formatters 有更好的方法吗? 回答: 通过合并Sergey Moiseev的答案和11380866的答案,我能够为指令添

日期格式设置在范围内

它被过滤器用来在标签中显示日期,并被指令从ngModel将函数放入$formatters中,以格式化输入中的日期

当作用域中的格式设置更改时,通过过滤器显示的日期将由angular刷新

但不是通过$formatters输入字段

我们发现,强制刷新的唯一方法是将所有字段设置为null,然后在$timeout中将它们重置为要显示的值,以强制重新执行$formatters

有更好的方法吗?

回答:

通过合并Sergey Moiseev的答案和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();
                }
            });

谢谢

我们能看看你的密码吗?很难弄清楚没有它你在做什么。很好,就是这样。请注意,您的小提琴通过将以下代码添加到手表中来工作:
code
var viewValue=ngModel.$modelValue;对于(ctrl.$formatters中的变量i){viewValue=ngModel.$formatters[i](viewValue);}ngModel.$viewValue=viewValue;ngModel.$render();