Я думаю, что лучше использовать директиву, потому что вы собираетесь коснуться DOM, а также потому, что вы можете сгруппировать всю логику, необходимую для этой формы, всего в одном месте (вы будете благодарить это, когда ваше приложение растет) и форма становится намного более переносимой.
Я немного изменил форму, теперь она использует только одну ngForm, а вкладки являются нормальными div. Форма и входные данные были даны именам, потому что директива ngForm нуждается в создании объекта formController.
Директива прослушивает клики по кнопке отправки, и мы используем объект formController для проверки ошибок и соответственно реагирования.
.directive('myForm', function() {
return {
restrict: 'A',
link: function (scope, elm, attrs) {
var inputs = elm.find('input'), //get all form inputs
inputTab1 = inputs[0], //asign each input to a var
inputTab2 = inputs[1],
submit = inputs[2];
scope.msg='not submitted';
scope.tab=1
//*** ng-form will create a scope var called myForm (myForm is the form's name)
angular.element(submit).bind('click', function (event) {
if(scope.myForm.$valid) {
//form is valid let it submit
scope.$apply(function() {
scope.msg = 'submited';
});
}else {
//form has erros
//event.preventDefault();
if(scope.myForm.tab1.$invalid) {
scope.$apply(function() {
scope.tab = 1;
inputTab1.focus();
});
}else if(scope.myForm.tab2.$invalid) {
scope.$apply(function() {
scope.tab = 2;
inputTab2.focus();
});
}
}
});
}
};
});
Вот fiddle
Если вы хотите получить более глубокую форму угловой, я рекомендую this tutorial.
Спасибо, что поделились своим решением. Я определенно постараюсь использовать функциональность, которую я могу повторно использовать в директиве. Однако у меня есть одна проблема с твоей. Используя inputTab1 = входы [0] и т. Д. ... ваша директива жестко привязана к вашей структуре DOM, которая плохой в Angular. – NicolasMoise
Согласитесь, директива была бы намного лучше с собственным шаблоном;) – Bema