AngularJs. $ SetPristine для скидання форми


76

Я намагався скинути форму після подання форми. Хтось опублікував це тут, і я хочу, щоб це працювало, але успіху не було. Ось мій приклад «Мій код» .

$scope.form.$setPristine();не встановлюється Pristine: {{user_form.$pristine}}як істина . Див. Приклад вище.


Дивлячись на ваш код, я думаю, що частина проблеми полягає в тому, що data.name очищається від звичайного кутового способу. Що робити, якщо ви оголосите дані у своїй моделі і фактично використовуєте $ scope.data.name = '' в рамках методу скидання. В іншому випадку ви можете спробувати $ scope.apply (); Я думаю, що модель все ще брудна, і тому вона не працює.
Лукас Холт,

Відповіді:


90

$ setPristine () було введено у гілку 1.1.x angularjs. Вам потрібно використовувати цю версію, а не 1.0.7, щоб вона працювала.

Див. Http://plnkr.co/edit/815Bml?p=preview


Ти правий. Одне питання. Коли це буде додано до стабільної версії. будь-яка ідея або вона буде використана у гілці 1.0.x ?. 1.1.5 не є стабільним.
Пірзада,

Я не впевнений, коли вони зроблять 1.1.x стабільним.
Лукас Холт,

@Rashid Angular 1.2 буде наступною стабільною версією (щоразу, коли вона вийде). Усі версії 1.1.x можуть зазнати змін API, але з тими ж змінами вам доведеться мати справу при переході з 1.0.x на 1.2.x.
Nate Bundy

15

У мене була подібна проблема, коли мені довелося встановити форму як первозданну, але також як недоторкану, оскільки $ invalid і $ error використовувались для відображення повідомлень про помилки. Тільки використання setPristine () було недостатньо для очищення повідомлень про помилки.

Я вирішив це за допомогою setPristine () та setUntouched (). (Див. Документацію Angular: https://docs.angularjs.org/api/ng/type/ngModel.NgModelController )

Отже, у своєму контролері я використав:

$scope.form.setPristine(); 
$scope.form.setUntouched();

Ці дві функції скидають повну форму до $ pristine і повертаються до $ untouched, щоб усі повідомлення про помилки були очищені.


6
Дякую за інформацію. У моєму випадку це були форми. $ SetPristine () та form. $ SetUntouched ().
Хав'єр Васкес,

Вони повинні були зробити доступною одну функцію для повного скидання
Jacob Stamm

12

Тільки для тих, хто хоче отримати $setPristineбез необхідності оновлення до v1.1.x, ось функція, яку я використав для імітації $setPristineфункції. Я неохоче використовував v1.1.5, оскільки один із використаних мною компонентів AngularUI не сумісний.

var setPristine = function(form) {
    if (form.$setPristine) {//only supported from v1.1.x
        form.$setPristine();
    } else {
        /*
         *Underscore looping form properties, you can use for loop too like:
         *for(var i in form){ 
         *  var input = form[i]; ...
         */
        _.each(form, function (input) {
            if (input.$dirty) {
                input.$dirty = false;
            }
        });
    }
};

Зверніть увагу, що це ТІЛЬКИ робить $dirtyполя чистими та допомагає змінити стан "показати помилку", наприклад $scope.myForm.myField.$dirty && $scope.myForm.myField.$invalid.

Інші частини об’єкта форми (наприклад, класи css) все ще потрібно розглянути, але це вирішує мою проблему: приховувати повідомлення про помилки.


7

Існує ще один спосіб первозданної форми, який полягає в надсиланні форми в контролер. Наприклад:-

З огляду на: -

<form name="myForm" ng-submit="addUser(myForm)" novalidate>
    <input type="text" ng-mode="user.name"/>
     <span style="color:red" ng-show="myForm.name.$dirty && myForm.name.$invalid">
      <span ng-show="myForm.name.$error.required">Name is required.</span>
    </span>

    <button ng-disabled="myForm.$invalid">Add User</button>
</form>

У контролері: -

$scope.addUser = function(myForm) {
       myForm.$setPristine();
};

6

Відповідь DavidLn добре працював у мене в минулому. Але він не охоплює всю функціональність setPristine, яка цього разу мене спокусила. Ось повніша шима:

var form_set_pristine = function(form){
    // 2013-12-20 DF TODO: remove this function on Angular 1.1.x+ upgrade
    // function is included natively

    if(form.$setPristine){
        form.$setPristine();
    } else {
        form.$pristine = true;
        form.$dirty = false;
        angular.forEach(form, function (input, key) {
            if (input.$pristine)
                input.$pristine = true;
            if (input.$dirty) {
                input.$dirty = false;
            }
        });
    }
};

4

Я вирішив ту ж проблему необхідності скинути форму в її первозданному стані в Angular версії 1.0.7 (без методу $ setPristine)

У моєму випадку використання форма після заповнення та подання повинна зникнути, поки це знову не стане необхідним для заповнення іншого запису. Тож я зробив ефект show / hide, використовуючи ng-switch замість ng-show. Як я підозрював, за допомогою ng-switch піддерево DOM форми повністю видаляється і згодом відтворюється. Тож незайманий стан автоматично відновлюється.

Мені це подобається, тому що він простий і чистий, але може не підходити ні для кого.

це також може означати деякі проблеми з продуктивністю для великих форм (?) У моїй ситуації я ще не стикався з цією проблемою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.