Да как угодно. Я когда-то для первого Angular делал так
.directive('translit', function() {
var rules = { // according to http://zakon3.rada.gov.ua/laws/show/55-2010-%D0%BF
'А' : 'A',
'Б' : 'B',
'В' : 'V',
'Г' : 'H',
'Ґ' : 'G',
'Д' : 'D',
'Е' : 'E',
'Є' : ['YE', 'IE'],
'Ж' : 'ZH',
'З' : 'Z',
'И' : 'Y',
'І' : 'I',
'Ї' : ['YI', 'I'],
'Й' : ['Y', 'I'],
'К' : 'K',
'Л' : 'L',
'М' : 'M',
'Н' : 'N',
'О' : 'O',
'П' : 'P',
'Р' : 'R',
'С' : 'S',
'Т' : 'T',
'У' : 'U',
'Ф' : 'F',
'Х' : 'KH',
'Ц' : 'TS',
'Ч' : 'CH',
'Ш' : 'SH',
'Щ' : 'SHCH',
'Ю' : ['YU', 'IU'],
'Я' : ['YA', 'IA'],
}
return {
link: function(scope, element, attrs) {
element.bind('blur', function(e) {
var translited = '';
element.val(element.val().toUpperCase());
var letters = element.val().split('');
letters.map(function(letter) {
var latinLetter;
rules[letter] ?
Array.isArray(rules[letter]) ?
letters.indexOf(letter) == 0 ? // checking if the letter is the first in the word
latinLetter = rules[letter][0] :
latinLetter = rules[letter][1]
: latinLetter = rules[letter]
: latinLetter = ''; // if there is no rule for the character, then replace with nothing
translited += latinLetter;
})
scope.$apply(function() {
scope.customer.personalData[attrs.translit] = translited;
})
})
}
}
})