Удалить значение из модели для динамически отключенного (через `expressionProperties`) поля?

Когда свойство выражения поля angular-formly (я использую v6.4.x с AngularJS 1.2.x) заставляет поле динамически переключаться между включенным и отключенным, переключение на отключенное не удаляет ранее введенное значение для этого поля из модели. Например:

  1. Использование примера расширенного макета от Formly
  2. Введите имя, чтобы фамилия была включена.
  3. Введите значение для фамилия
  4. Удалите значение имя, чтобы снова отключить фамилию.
  5. Обратите внимание, что модель по-прежнему содержит данные, введенные для фамилии, даже если она отключена.

Учитывая, как disabled работает для стандартной отправки формы HTML, я ожидаю, что модель больше не будет содержать значение для этого поля.

Мне нужно избегать отправки данных для поля, которое было отключено, поэтому, если это запланированное поведение (и я не знаю, что это так...), может ли кто-нибудь предложить мысли о том, как выполнить удаление значения всякий раз, когда expressionProperties приводит к отключению поля?


person JAAulde    schedule 15.06.2015    source источник
comment
Это определенно предполагаемое поведение, потому что angular-formly не более чем отключает поле, используя angular ng-disabled, который не очистит модель. Если вы хотите иметь дополнительное поведение (очистить модель), вам придется проделать дополнительную работу. expressionProperties, вероятно, не место для выполнения этой дополнительной работы. Вы можете подумать о добавлении controller, у которого есть $scope.$watch('to.disabled', function() {.. your logic ..}), чтобы реагировать на изменение.   -  person kentcdodds    schedule 15.06.2015
comment
@kentcdodds, спасибо за ваши мысли. Я слышу вас, и согласен, что это, вероятно, предназначено. Для меня странно, что отключенный элемент формы по умолчанию будет включен в результирующую модель, но это нормально. Я готов сделать дополнительную работу, но я не чувствовал, что часы были бы лучше. Однако для ясности и для того, чтобы помочь мне принять решение, не могли бы вы объяснить ценность ваших часов to.disabled? Это заполнитель для моего имени поля, или это означает что-то особенное в Angular?   -  person JAAulde    schedule 17.06.2015
comment
Да, это может быть или не быть лучшим подходом, но это подход, который принял angular, и angular-formly не делает никакой дополнительной работы, чтобы изменить это. to — это сокращение от options.templateOptions. options относится к параметрам конфигурации вашего поля. Это не означает ничего особенного для angular, это просто то, что находится в области formly-field, что вы получаете, когда добавляете controller в поле и вводите $scope   -  person kentcdodds    schedule 17.06.2015
comment
@kentcdodds Еще раз спасибо, вы помогли мне собрать работающее решение.   -  person JAAulde    schedule 17.06.2015


Ответы (1)


Комментарии kentcdodds заставили меня двигаться в правильном направлении и найти в документах достаточно фрагментов, чтобы что-то заработало. В моей самой непосредственной задаче мне нужна была опция радио, чтобы удалить ее из модели, когда она отключена, и в итоге я тоже отключил ее. Я сделал это, расширив тип ввода radio и добавив функцию link для доступа к scope и element. Ниже что-то вроде того, как это выглядит:

app.config(['formlyConfigProvider', function (formlyConfigProvider) {
    formlyConfigProvider.setType({
        name: 'liveDisableRadio',
        extends: 'radio',
        link: function (scope, element) {
            scope.$watch('to.disabled', function (is_disabled) {
                if (is_disabled) {
                    delete scope.model[scope.options.key];
                    element.find(':radio:checked').prop('checked', false).trigger('change');
                }
            });
        }
    });
}])
person JAAulde    schedule 17.06.2015