Я пишу простую форму входа в систему, используя angularjs с некоторой проверкой ввода на стороне клиента, чтобы проверить, что имя пользователя и пароль не пусты и длиннее трех символов. Смотрите ниже код:
<form name="loginform" novalidate ng-submit="login.submit()" class="css-form">
<fieldset>
<div class="control-group input-prepend">
<span class="add-on"><i class="icon-user"></i></span>
<input type="text" ng-model="login.username" name="username" required ng-minlength="3" placeholder="username" />
</div>
<div class="control-group input-prepend">
<span class="add-on"><i class="icon-lock"></i></span>
<input type="password" ng-model="login.password" name="password" required ng-minlength="3" placeholder="" />
</div>
<div class="control-group">
<input class="btn" type="submit" value="Log in">
</div>
</fieldset>
</form>
И контроллер:
var controller = function($scope) {
$scope.login = {
submit: function() {
Console.info($scope.login.username + ' ' + $scope.login.password);
}
}
};
Проблема заключается в том, что login.submit
функция будет вызываться, даже если ввод неверен. Можно ли предотвратить такое поведение?
В качестве примечания могу упомянуть, что я использую также bootstrap и requirejs.
angularjs
validation
Рунар Халс
источник
источник
Ответы:
Ты можешь сделать:
Нет необходимости в проверках контроллера.
источник
&&
я попытался передать значение как часть подтверждения и подтвердил, что само значение равно «false»)Измените кнопку отправки на:
источник
Таким образом, предложенный ответ от TheHippo у меня не сработал, вместо этого я отправил форму в качестве параметра функции следующим образом:
Это делает форму доступной в методе контроллера:
источник
Ваши формы автоматически помещаются в $ scope как объект. Доступ к нему можно получить через
$scope[formName]
Ниже приведен пример, который будет работать с вашей первоначальной настройкой и без необходимости передавать саму форму в качестве параметра в ng-submit.
Рабочий пример: http://plnkr.co/edit/BEWnrP?p=preview
источник
if(this.loginform.$invalid)
.. вместо этого, но тогда в HTML вы должны дать форме имя<form name="ctrl.loginform" ..
. И это при условии, что вы используете<div ng-controller="controller as ctrl"..
в своем контроллере как синтаксис. Спасибо @JoshCarollHTML:
В вашем контроллере:
источник
event.preventDefault()
есть способ остановить отправку формы.Хотя это и не прямое решение вопроса OP, если ваша форма находится в
ng-app
контексте, но вы хотите, чтобы Angular полностью ее игнорировал, вы можете сделать это явно, используяngNonBindable
директиву:источник
Просто чтобы добавить к ответам выше,
У меня были 2 обычные кнопки, как показано ниже. (No type = "submit" в любом месте)
Независимо от того, сколько я пытался, нажав клавишу ввода после того, как форма была действительной , была вызвана кнопка «Очистить форму», очистив всю форму.
В качестве обходного пути,
Мне пришлось добавить фиктивную кнопку отправки, которая была отключена и скрыта. И эта фиктивная кнопка должна быть поверх всех других кнопок, как показано ниже .
Ну, я никогда не собирался отправлять на Enter, так что вышеупомянутый взлом просто отлично работает.
источник
Я знаю, что это старая ветка, но я тоже хотел бы внести свой вклад. Мое решение похоже на пост, уже помеченный как ответ. Некоторые встроенные проверки JavaScript делают свое дело.
источник
Я знаю, что уже поздно, и мне ответили, но я хотел бы поделиться тем, что я сделал. Я создал директиву ng-validate, которая перехватывает отправку формы, а затем выдает предотвратитель по умолчанию, если $ eval имеет значение false:
В вашем HTML:
источник