Ошибка сброса формы angularjs
Я пытаюсь сделать форму с проверками, используя angularjs, и до сих пор я проделал хорошую работу. Но когда я фиксирую кнопку сброса, все поля сбрасываются, кроме сообщений об ошибках, которые я получаю из своей части проверки. Как я могу избавиться от всех полей и сообщений об ошибках при сбросе формы.
Вот как это происходит, когда я нажимаю кнопку сброса
это мой код
<div class="page-header"><center><h2>Give us your Feedback</h2></center></div>
<!-- pass in the variable if our form is valid or invalid -->
<form name="userForm" ng-submit="submitForm(userForm.$valid)" novalidate>
<!-- NAME -->
<div class="form-group" ng-class="{ 'has-error' : userForm.name.$invalid && !userForm.name.$dirty }">
<label>Name*</label>
<input type="text" name="name" class="item-input-wrapper form-control" ng-model="user.name" required>
<p ng-show="userForm.name.$invalid && !userForm.name.$pristine " class="help-block">
<font color="#009ACD">You name is required.</font>
</p>
</div>
<!-- EMAIL -->
<div class="form-group" ng-class="{ 'has-error' : userForm.email.$invalid && !userForm.email.$dirty }">
<label>Email</label>
<input type="email" name="email" class="item-input-wrapper form-control" ng-model="user.email" required >
<p ng-show="userForm.email.$invalid && !userForm.email.$pristine" class="help-block">
<font color="#009ACD">Enter a valid email.</font>
</p>
</div>
<!-- USERNAME -->
<div class="form-group" ng-class="{ 'has-error' : userForm.username.$invalid && !userForm.username.$dirty }">
<label>Description</label>
<input type="text" name="username" class="item-input-wrapper form-control" ng-model="user.username" ng-minlength="5" ng-maxlength="60" required>
<font color="white">
<p ng-show="userForm.username.$error.minlength" class="help-block">
<font color="#009ACD">Description is too short.</font>
</p>
<p ng-show="userForm.username.$error.maxlength" class="help-block">
<font color="#009ACD">Description is too long.</font>
</p>
</font>
</div>
<div class="col"style="text-align: center">
<button align="left"class="button button-block button-reset"style="display: inline-block;width:100px;text-align:center "
type="reset"
ng-click="reset()" padding-top="true"
>
Reset
</button>
<button class="button button-block button-positive" style="display: inline-block;width:100px "
ng-click="submit()"
padding-top="true"
>
Submit
</button>
</div>
</form>
</div>
Мой контроллер
.controller('ContactCtrl', function($scope,$state,$ionicPopup, $timeout) {
$scope.showfeedback = function() {
$state.go('app.sfeedback');
};
$scope.submitForm = function(isValid) {
$scope.submitted = true;
// check to make sure the form is completely valid
if (!isValid) {
var alertPopup = $ionicPopup.alert({
title: 'Invalid data entered!',
});
} else {
var alertPopup = $ionicPopup.alert({
title: 'Feedback submitted',
});
}
};
$scope.reset = function() {
var original = $scope.user;
$scope.user= angular.copy(original)
$scope.userForm.$setPristine()
};
})
12 ответов
var original = $scope.user;
при сбросе:
$scope.user= angular.copy(original);
$scope.userForm.$setPristine();
Удалить
type='reset' in <button>
Вот угловая документация для контроллеров форм.
Используйте следующее для сброса грязного состояния
$scope.form.$setPristine();
Используйте следующее для сброса, чтобы очистить проверку
$scope.form.$setValidity();
Есть документация по API на FormController.
Это позволило мне обнаружить, что есть другие методы для вызова, такие как:
$setUntouched()
- это функция, которую я использовал, если пользователь сфокусировался на поле, а затем покинул поле, это отключит эту функцию при запуске.
Я создал простую функцию сброса формы, которую вы тоже можете использовать.
// Set the following in your controller for the form/page.
// Allows you to set default form values on fields.
$scope.defaultFormData = { username : 'Bob'}
// Save a copy of the defaultFormData
$scope.resetCopy = angular.copy($scope.defaultFormData);
// Create a method to reset the form back to it's original state.
$scope.resetForm = function() {
// Set the field values back to the original default values
$scope.defaultFormData = angular.copy($scope.resetCopy);
$scope.myForm.$setPristine();
$scope.myForm.$setValidity();
$scope.myForm.$setUntouched();
// in my case I had to call $apply to refresh the page, you may also need this.
$scope.$apply();
}
В вашей форме эта простая настройка позволит вам сбросить форму
<form ng-submit="doSomethingOnSubmit()" name="myForm">
<input type="text" name="username" ng-model="username" ng-required />
<input type="password" name="password" ng-model="password" ng-required />
<button type="button" ng-click="resetForm()">Reset</button>
<button type="submit">Log In</button>
</form>
Я пошел с...
$scope.form.$setPristine();
$scope.form.$error = {};
Чувствует себя хакером... но многое из угловатых делает.
Кроме того... это было единственное, что сработало.
У меня была та же проблема, и я использовал следующий код для полного сброса формы:
$scope.resetForm = function(){
// reset your model data
$scope.user = ...
// reset all errors
for (var att in $scope.userForm.$error) {
if ($scope.userForm.$error.hasOwnProperty(att)) {
$scope.userForm.$setValidity(att, true);
}
}
// reset validation's state
$scope.userForm.$setPristine(true);
};
Для меня с помощью $setPristine
сбросить форму это взломать. Настоящее решение состоит в том, чтобы сохранить его таким, каким он должен быть
<button type="reset" ng-click="reset()"></button>
тогда в угловых:
var original = angular.copy($scope.user);
$scope.reset = function() {
$scope.user = angular.copy(original);
};
и это все.
В моей форме
<form angular-validator-submit="submitReview()" name="formReview" novalidate angular-validator>
<input type="text" name="Rating" validate-on="Rating" class="form-control"
ng-model="Review.Rating" required-message="'Enter Rating'" required>
<button type="button" ng-click="reset()">Cancel</button>
</form>
app.controller('AddReview', function ($scope) {
$scope.reset= function () {
$scope.formReview.reset()
};
});
нужно только позвонить $scope.formReview.reset()
где formReview - это имя моей формы.
Использовать этот
<button type="button" ng-click='resetForm()'>Reset</button>
В контроллере
$scope.resetForm = function(){
$scope.userForm.$dirty = false;
$scope.userForm.$pristine = true;
$scope.userForm.$submitted = false;
};
Это работает для меня
Оставьте свой отзыв
<!-- pass in the variable if our form is valid or invalid -->
<form name="userForm" ng-submit="submitForm(userForm.$valid)" novalidate>
<!-- NAME -->
<div class="form-group" ng-class="{ 'has-error' : userForm.name.$invalid && !userForm.name.$dirty }">
<label>Name*</label>
<input type="text" name="name" class="item-input-wrapper form-control" ng-model="user.name" required>
<p ng-show="userForm.name.$invalid && !userForm.name.$pristine " class="help-block"><font color="#009ACD">You name is required.</font></p>
</div>
<!-- EMAIL -->
<div class="form-group" ng-class="{ 'has-error' : userForm.email.$invalid && !userForm.email.$dirty }">
<label>Email</label>
<input type="email" name="email" class="item-input-wrapper form-control" ng-model="user.email" required >
<p ng-show="userForm.email.$invalid && !userForm.email.$pristine" class="help-block"><font color="#009ACD">Enter a valid email.</font></p>
</div>
<!-- USERNAME -->
<div class="form-group" ng-class="{ 'has-error' : userForm.username.$invalid && !userForm.username.$dirty }">
<label>Description</label>
<input type="text" name="username" class="item-input-wrapper form-control" ng-model="user.username" ng-minlength="5" ng-maxlength="60" required>
<font color="white"><p ng-show="userForm.username.$error.minlength" class="help-block"><font color="#009ACD">Description is too short.</font></p>
<p ng-show="userForm.username.$error.maxlength" class="help-block"><font color="#009ACD">Description is too long.</font></p>
</div>
<div class="col"style="text-align: center">
<button align="left"class="button button-block button-reset"style="display: inline-block;width:100px;text-align:center "
type="reset"
ng-click="reset()"padding-top="true">Reset</button>
<button class="button button-block button-positive" style="display: inline-block; width:100px" ng-click="submit()"padding-top="true">Submit</button>
</div>
</form>
Я держал type="reset"
в моей кнопке. То, что я сделал, было ng-click="resetForm(userForm)"
(с помощью userFrom
в соответствии с вашим примером) и контроллер определяет resetForm()
как
scope.resetForm = function(controller) {
controller.$commitViewValue();
controller.$setPristine();
};
Вот что происходит:
- Когда кнопка сброса нажата, она вернет исходные значения, как указано
value
атрибут на входе $commitViewValue()
вынудит записать все, что есть на данный момент на$modelValue
каждого поля (нет необходимости повторять вручную), без этого последний$modelValue
все равно будет сохранен, а не сброшен.$setPristine()
сбросит все остальные проверки и отправленные поля.
В моем angular-bootstrap-validator у меня уже был FormController
как таковой мне не нужно было передавать в самой форме.
В случае, если у вас нет мастера (динамические модели с сервера), и вы хотите сбросить форму, но только связанную часть модели, вы можете использовать этот фрагмент:
function resetForm(form){
_.forEach(form, function(elem){
if(elem !== undefined && elem.$modelValue !== undefined){
elem.$viewValue = null;
elem.$commitViewValue();
}
});
}
И тогда вы можете использовать его со стандартным reset button
вот так:
<button type="reset" ng-click="resetForm(MyForm);MyForm.$setValidity();">reset</button>
Моя форма находится внутри другой области, поэтому в моем решении нужно использовать $$postDigest
$scope.$$postDigest(function() {
$scope.form.$error = {};
});
Чтобы сбросить проверки, мы должны сделать две вещи:
- очистить поля
Добавьте следующее:
$scope.programCreateFrm.$dirty = false; $scope.programCreateFrm.$pristine = true; $scope.programCreateFrm.$submitted = false;
programCreateFrm
это имя формы. Например:
<form name="programCreateFrm" ng-submit="programCreateFrm.$valid && createProgram(programs)" novalidate>
Этот код работает для меня.