Отправка формы с угловым связыванием несколькими кнопками
У меня есть форма с несколькими кнопками отправки:
<form name="myForm" customSubmit>
<input type="text" ng-minlength="2">
<button type="submit" ng-click="foo1()"></button>
<button type="submit" ng-click="foo2()"></button>
</form>
и директива:
angular.module('customSubmit', [])
.directive('customSubmit', function() {
return {
require: '^form',
scope: {
submit: '&'
},
link: function(scope, element, attrs, form) {
element.on('submit', function() {
scope.$apply(function() {
form.$submitted = true;
if (form.$valid) {
return scope.submit();
}
});
});
}
};
});
Моя цель - отправить форму только тогда, когда она действительна, с несколькими кнопками отправки (т.е. я не могу использовать в форме директиву ng-submit). Приведенный выше код не работает. Как правильно это сделать? Это вообще возможно?
2 ответа
Решением было поместить директиву на кнопку отправки и использовать директиву 'require':
<form>
<button my-form-submit="foo()"></button>
</form>
angular.module('myFormSubmit', [])
.directive('myFormSubmit', function() {
return {
require: '^form',
scope: {
callback: '&myFormSubmit'
},
link: function(scope, element, attrs, form) {
element.bind('click', function (e) {
if (form.$valid) {
scope.callback();
}
});
}
};
});
Я бы посоветовал вам использовать один из более простых способов сделать это. Просто проверьте, что ваша форма действительна или нет ng-click
& если он действителен, вызовите из него нужный метод.
наценка
<form name="myForm" customSubmit>
<input type="text" ng-minlength="2">
<button type="button" ng-click="myForm.$valid && foo1()"></button>
<button type="button" ng-click="myForm.$valid && foo2()"></button>
</form>
Но проверка myForm.$valid
на каждый клик смотрит бит повторяющийся код в количество раз. Вместо этого у вас может быть один метод в области видимости контроллера, который будет проверять форму и вызывать нужный метод для отправки формы.
наценка
<form name="myForm" customSubmit>
<input type="text" ng-minlength="2">
<button type="button" ng-click="submit('foo1')"></button>
<button type="button" ng-click="submit('foo2')"></button>
</form>
Код
$scope.submit = function(methodName){
if($scope.myForm.$valid){
$scope[methodName]();
}
}
В обоих случаях вы могли бы заставить вас
button
введите вbutton
вместоsubmit
Обновить
Чтобы сделать его общим, вам нужно поместить его на каждую кнопку вместо того, чтобы form
один раз.
HTML
<form name="myForm">
<input type="text" name="test" ng-minlength="2" ng-model="test">
<button custom-submit type="submit" fire="foo1()">foo1</button>
<button custom-submit type="submit" fire="foo2()">foo2</button>
</form>
Код
angular.module("app", [])
.controller('Ctrl', Ctrl)
.directive('customSubmit', function() {
return {
require: '^form',
scope: {
fire: '&'
},
link: function(scope, element, attrs, form) {
element.on('click', function(e) {
scope.$apply(function() {
form.$submitted = true;
if (form.$valid) {
scope.fire()
}
});
});
}
};
});