Установите значение в $ scope и используйте для него $ parsers

0

У меня есть поле в $ 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
});
  • 0
    может случиться так, что ваш storage.phone не разрешен и до вызова этой директивы. Можете ли вы показать нам контроллер, где вы устанавливаете storage.phone?
  • 0
    Извините, забыл удалить эту часть реального кода. Это значение существует и вставляется необработанным, а не отформатированным анализатором.
Теги:
angularjs-scope
angularjs-directive

1 ответ

0
Лучший ответ

синтаксические анализаторы предназначены для преобразования значений представления в значения модели и форматировщики используются для преобразования значений модели для просмотра значений.

Вам нужно вставить форматтер, который преобразует ваше (инициализированное) значение модели в требуемое значение вида.

  • 0
    Это хорошее разъяснение, но мое решение кажется грязным (обновленный код в исходном посте для многострочного кода). Что мне не хватает?
  • 0
    Это довольно аккуратно, если только вы не хотите переместить изменение (.replace) в отдельную функцию, локальную для директивы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню