Исключить управление из воздействия на форму $pristine

У меня есть текстовый ввод в директиве, которую я хочу использовать в качестве фильтра для отображения списка элементов, но я не хочу, чтобы ввод фильтра влиял на содержащее значение формы $pristine, чтобы ввод фильтра не включить сохранение и показать сброс. Как мне это сделать в angularJS (1.6.x)?

шаблон директивы

<form name='myForm'>
    <input placeholder="Filter" class='form-control' type='text' ng-model='vm.searchText'>
    <ul><li ng-repeat='item in vm.list | filter:vm.searchText'/></ul>
    <div>
        <br>
        <button class='btn btn-primary' ng-click='vm.save()' ng-disabled="myForm.$pristine || frmCrm.$invalid">Save</button>
        <div class='pull-right'>
            <button class='btn btn-warning' ng-click="vm.reset()" ng-hide="myForm.$pristine">Reset</button>
        </div>
    </div>
</form>

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

вот пример plnkr: http://plnkr.co/edit/y1dJLPbyvlZuIW1f7ey9


person BlackICE    schedule 02.01.2018    source источник


Ответы (1)


Вы можете переопределить методы $setDirty и $setPristine ngModel:

angular.module('xyz').directive('dontCheck', function() {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, element, attrs, ngModelCtrl) {
      //set to empty functions
      ngModelCtrl.$setPristine = angular.noop;
      ngModelCtrl.$setDirty = angular.noop;
    }
  }
});

Я разветвил ваш плункер, вы можете попробовать решение: http://plnkr.co/edit/6UVTQjJtwu4mOXVt7sPT?p=preview

Изменить: обновлен плункер, чтобы следовать вашему стилю кода. Я оставлю код здесь как есть.

person edo.n    schedule 02.01.2018