Я использую настраиваемую директиву для отправки формы программно, однако перед отправкой формы формальная проверка не применяется. Я набрал $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>
Почему код вводит $ timeout, но вместо этого использует необработанный 'setTimeout'? $ timeout надлежащим образом завершает 'setTimeout' и интегрируется с циклом дайджеста AngularJS. Использование raw setTimeout кажется проблематичным. – georgeawg
Ах. Поскольку я получал $ timeout, это не ошибка функции. Печать '$ timeout' на консоли в конструкторе показывает, что она' undefined'. Есть идеи? – Codewise