-1

Я использую настраиваемую директиву для отправки формы программно, однако перед отправкой формы формальная проверка не применяется. Я набрал $setDirty() в поле формы и $setSubmitted(), но форма по-прежнему отправляется, даже если поле формы заполнено.Пробная форма проверки программно в angular-js

директивы/external.submit.js

export default class externalSubmit { 
    constructor ($timeout) { 
     'ngInject'; 
     this.$timeout = $timeout; 
     this.restrict = 'A'; 
     this.scope = {}; 
    } 

    link($scope, $element, $attrs) { 
     $scope.$on('submit-form', function(event, data){ 
      if(data.id === $attrs.id) { 
       setTimeout(function() { 

       /** 
       * set form and fields to dirty 
       * this should be enabling validation 
       **/ 
       var $formScope = angular.element($element).scope(); 
       var $formController = $formScope[formName]; 

       $formController.$setDirty(); 
       $formController.$setSubmitted(); 
       angular.forEach($formController.$error.required, function(field) { 
       field.$setDirty(); 
       }); 

       // trigger form submit 
       $element.triggerHandler('submit'); 
       }, 0); 
      } 
     }); 
    } 

    // Create an instance so that we can access this inside link 
    static factory() { 
     externalSubmit.instance = new externalSubmit(); 
     return externalSubmit.instance; 
    } 
}; 

Foo/foo.controller.js

export default class FooController { 
    constructor($rootScope) { 
     'ngInject'; 

     this.$rootScope = $rootScope; 
     this.item = {}; 

    } 

    save() { 
     alert('Save triggered'); 
    } 

    submitForm(id) { 
     // if no form id given, use the first form in the content area 
     if (! id) id = $('form')[0].id; 
     this.$rootScope.$broadcast('submit-form',{'id':id}); 
    } 

} 

Foo/foo.html

<form external-submit id="primary" ng-submit="$ctrl.save()" go-back="dashboard.home()"> 
    <input type="hidden" ng-model="$ctrl.item.id"/> 
    <input required name="title" ng-model="$ctrl.item.title" type="text" /> 
    <button type="submit">Internal Submit</button> 
</form> 

<button type="submit" ng-click="$ctrl.submitForm()">External Submit</button> 
+0

Почему код вводит $ timeout, но вместо этого использует необработанный 'setTimeout'? $ timeout надлежащим образом завершает 'setTimeout' и интегрируется с циклом дайджеста AngularJS. Использование raw setTimeout кажется проблематичным. – georgeawg

+0

Ах. Поскольку я получал $ timeout, это не ошибка функции. Печать '$ timeout' на консоли в конструкторе показывает, что она' undefined'. Есть идеи? – Codewise

ответ

-1

Решение состоит в том, чтобы проверить $formController, чтобы узнать, действительна ли форма до запуска обработчика submit.

link($scope, $element, $attrs, $ctrl) {  

    $scope.$on('submit-form', function(event, data){ 

     if(data.id === $attrs.id) { 
      let formName = $attrs.name; 
      setTimeout(function() { 

      // get the element scope 
      var $formScope = angular.element($element).scope(); 

      // get the form controller using the form name 
      var $formController = $formScope[formName]; 
      $formController.$setSubmitted(); 

      // check if form is valid before triggering submit 
      if ($formController.$valid) { 
       $element.triggerHandler('submit'); 
      } 

      // required to update form styles 
      $scope.$apply(); 

      }, 0); 
     } 
    }); 
} 
0

Применение ng-submit="$valid && $ctrl.save()"

+0

Хорошо, это вызывает проверку формы, однако, когда мои поля действительны, $ ctrl.save() никогда не вызывается - при использовании внутренней или внешней кнопки. – Codewise