Я принял ответ от karaxuna, но сделал несколько корректировок. Во-первых, я использовал директиву, а не фильтр, хотя я не понимаю, почему фильтр не работает. Однако в моем случае были и другие сложности, с которыми я не хотел оспаривать вопрос, что заставило меня хотеть дополнительную власть, которую могут дать директивы.
Второе отличие заключается в том, что я не реализовал свою собственную поддержку форматирования/языка - я использовал momentJs, который делает оба из коробки.
Вот сокращенная фрагмент кода (в машинописном):
interface ValueformatterScope extends ng.IScope {
value: string;
dataType: string;
i18nService: I18nService;
}
class ValueFormatter {
constructor(i18nService: I18nService) {
return {
restrict: 'AC', // Only apply on an attribute or class
scope: {
value: '=ngModel', // The two-way data bound value that is returned by the directive
dataType: '=dataType',
},
link: (scope: ValueformatterScope, element: JQuery) => {
function render() {
var formattedText: string;
if (scope.value == null || scope.value === '') {
formattedText = "";
}
else if (scope.value == '-') {
formattedText = '-';
}
else if (scope.dataType == 'DATE') {
//dates should be shown in GMT (i.e., not converted to local timezone from DB)
var dateUtc = Util.getUtcDate(scope.value);
formattedText = moment(dateUtc).format(i18nService.locale.dateFormat);
}
element.text(formattedText);
}
scope.i18nService = i18nService;
scope.$watch("i18nService.locale",() => {
render();
});
scope.$watch('value',() => {
render();
});
}
}
}
}
Когда пользователь включает локаль, я просто называю moment.locale(newLocale)
, а затем обновить значение i18nService.locale
, который запускает $watch
Не пробовав ничего подобного, я бы подумал, что изменить локаль - это путь. – dmvianna
Я не думаю, что основная угловая функциональность i18n поддерживает изменение локали на лету. –
Мы говорим о JavaScript. Поддерживает ли Angular JavaScript? XD – dmvianna