У меня есть поле в $ scope (я новичок в терминологии angularjs), который связан в html:
<input type="text" ng-model="phone" format-phone/>
Format-phone - это настраиваемая директива, которая добавляет парсер для значения вида:
.directive('formatPhone', () => ({
require: '?ngModel',
link: (scope, elem, attrs, ctrl) => {
if (!ctrl) return;
ctrl.$parsers.unshift(viewValue => {
var phone = viewValue.substring(0, 12).replace(/* some custom replace */);
elem.val(phone.replace(/* another custom replace */)));
return phone;
});
}
}))
Это отлично работает и изменяет модель и просматривает значения по назначению. Я хочу добавить значение по умолчанию модели в код контроллера, поэтому я добавил эту строку:
$scope.phone = '1112223344';
Но это значение не обрабатывается парсером в директиве и остается сырым, пока я не отредактирую его в первый раз. Могу ли я явно вызвать парсер на представление/модель из контроллера без написания другой директивы инициализации? Или, может быть, я могу установить значение представления, которое будет автоматически обрабатываться парсером?
UPD: Благодаря @potatopeelings я сделал это лучше, но это решение выглядит очень плохо. У меня есть альтернатива для вызова форматирования из парсера?
ctrl.$formatters.unshift(modelValue => {
modelValue; // 123456
return modelValue.replace(...); // View value is now (123)45-6
});
ctrl.$parsers.unshift(viewValue => {
var phone = viewValue.replace(...); // (123)456 -> 123456
elem.val(ctrl.$formatters[0](phone)); // Element value is now (123)45-6
return phone; // Model value is now 123456
});
синтаксические анализаторы предназначены для преобразования значений представления в значения модели и форматировщики используются для преобразования значений модели для просмотра значений.
Вам нужно вставить форматтер, который преобразует ваше (инициализированное) значение модели в требуемое значение вида.