Угловые четкие данные подформы и проверка сброса
Я пытаюсь создать подформу <div ng-form="vacancyForm">
с углового.js
существует тип данных, который имеет множество полей
- заголовок
- дата поступления
- цена
все required
проверка на них.
как только я отправлю эти данные, я сделаю с ними все, что мне нужно, но я хочу сбросить подформу, чтобы все поля не были грязными, и форма действительна, так как на данный момент очистка полей работает но все поля недействительны, поскольку они теперь грязные, но пустые, помечая их как недействительные.
пример поля
<div class="control-group" ng-class="getErrorClasses(vacancyForm.headline)">
<label class="control-label" for="headline">Headline</label>
<div class="controls">
<input type="text" class="input-xlarge" id="headline" name="headline" required ng-model="new_vacancy.headline">
<span class="help-inline" ng-show="showError(vacancyForm.headline, 'required')">This field is required</span>
</div>
</div>
вот функция, которая вызывается при отправке
$scope.addVacancy = function(){
// save the submitted data
$scope.school.vacancies.push($scope.new_vacancy);
// now clear it out
$scope.new_vacancy = {};
$scope.new_vacancy.date = new Date();
// this clears out all the fields and makes them all invalid
// as they are empty. how to reset the form???
}
1 ответ:
использовать
<form>
- тег и выберитеname
атрибут, а затем вы можете$scope.formName.$setPristine();
здесьformName
это то, что атрибут name. Элемент больше не является первозданным, когда значение было изменено.http://docs.angularjs.org/api/ng.directive:form.FormController#$setPristine
обновление
Приведенный выше ответ был исключительно для 1.2, но в 1.3 angular введено понятие "тронутого" входа. Теперь, когда элемент размыт угловой отметит поле как тронутое. Похоже на$setPristine
, вы можете установить входной сигнал с помощью$scope.formName.$setUntouched()
.https://docs.angularjs.org/api/ng/type/form.FormController#$setUntouched
прикоснулся vs pristine: прикосновение означает, что поле было размыто, а нетронутое означает, что значение поля было изменено. Документы Angular отмечают, что " установка элементов управления формы обратно в их нетронутое состояние часто полезно при установке формы обратно его первозданное состояние."
Edit
Вот скрипка демо:https://jsfiddle.net/TheSharpieOne/a30kdtmo/angular.module('myApp', []) .controller('myCtrl', myCtrl); function myCtrl() { var vm = this; vm.reset = function() { vm.myForm.$setPristine(); vm.myForm.$setUntouched(); vm.email = vm.password = ''; } }
.ng-invalid.ng-touched { outline: 2px solid blue; } .ng-invalid.ng-dirty { outline: 2px solid red; } .ng-invalid.ng-dirty.ng-untouched { outline: 2px solid green; } form, form div { padding: 5px 10px; } h3, h4 { margin-bottom: 0; }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script> <div ng-app="myApp" ng-controller="myCtrl as ctrl"> <form name="ctrl.myForm"> <div> <label for="email">Email</label> <input name="myInput" type="email" ng-model="ctrl.email" id="email" required> </div> <div> <label for="password">Password</label> <input name="myPassword" type="password" minlength="8" ng-model="ctrl.password" id="password" required> </div> <div> <button ng-click="ctrl.reset()" type="button">Reset</button> </div> </form> <div> <h4>Form Level</h4> <div>$dirty: {{ctrl.myForm.$dirty}}</div> <div>$pristine: {{ctrl.myForm.$pristine}}</div> <h4>Input Level</h4> <h5>Email Input</h5> <div>$dirty: {{ctrl.myForm.myInput.$dirty}}</div> <div>$pristine: {{ctrl.myForm.myInput.$pristine}}</div> <div>$touched: {{ctrl.myForm.myInput.$touched}}</div> <h5>Password Input</h5> <div>$dirty: {{ctrl.myForm.myPassword.$dirty}}</div> <div>$pristine: {{ctrl.myForm.myPassword.$pristine}}</div> <div>$touched: {{ctrl.myForm.myPassword.$touched}}</div> </div> <div> <h3>Color outlines for input</h3> <div title="The form loads this way, it can still be invalid since required fields are empty to start with">untouched, pristine: no outline</div> <div title="Such as in the middle of typing a valid email for the first time">invalid, untouched, dirty: green outline</div> <div title="blurred with invalid input">invalid, touched, dirty: red outline</div> <div title="focued and blurred without typing">invalid, touched: blue outline</div> </div> </div>