У AngularJS, яка різниця між ng-незайманими та ng-брудними?


109

Які відмінності між ng-pristineі ng-dirty? Здається, у вас може бути і те, і інше true:

$scope.myForm.$pristine = true; // after editing the form

Відповіді:


214

ng-dirtyКлас говорить вам , що форма була змінена користувачем, в той час як ng-pristineклас говорить вам , що форма не була змінена користувачем. Так ng-dirtyі ng-pristineє дві сторони однієї і тієї ж історії.

Класи встановлюються в будь-якому полі, тоді як форма має два властивості, $dirtyі $pristine.

Ви можете скористатися $scope.form.$setPristine()функцією, щоб повернути форму до первинного стану (врахуйте, що це функція AngularJS 1.1.x).

Якщо ви бажаєте $scope.form.$setPristine()поведінки -ish навіть у 1.0.x гілці AngularJS, вам потрібно прокрутити власне рішення (деякі досить хороші з них можна знайти тут ). В основному це означає повторення над усіма полями форми та встановлення їх $dirtyпрапора false.

Сподіваюся, це допомагає.


2
Хороша відповідь, але чому 2 класи, якщо це дві сторони однієї історії? Як я вже говорив, ви можете бути істинними, або хибними.
синергетика

6
Це правильно, але я думаю (побоююся), що це питання, на яке можуть відповісти лише розробники AngularJS. Іншими словами: я не знаю.
Голо Роден

2
@synergetic - це як ng-show і ng-hide в основному, одного достатньо, але у нас є два без видимих ​​причин
Labib Ismaiel

1
@synergetic ng-show є семантично більш простим для розуміння, і для його розуміння потрібен один менш пізнавальний крок, ніж! ng-hid. вашому мозку потрібно зробити цей додатковий крок, і, таким чином, ви більше шансів ввести помилок
Даміан Грін

4
Я думаю, що це залежить від вашого наміру: Іноді ви хочете показати додаткові речі з урахуванням конкретної ситуації, а іноді вам потрібно приховати деякі речі з урахуванням конкретної ситуації. Залежно від випадку використання, обидва можуть бути доречними. Звичайно, хоча технічно це саме, навмисно це не так.
Голо Роден

41

первозданний повідомляє нам, що поле все ще незаймане, а брудне повідомляє нам, якщо користувач уже щось набрав у відповідному полі:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>
<form ng-app="" name="myForm">
  <input name="email" ng-model="data.email">
  <div class="info" ng-show="myForm.email.$pristine">
    Email is virgine.
  </div>
  <div class="error" ng-show="myForm.email.$dirty">
    E-mail is dirty
  </div>
</form>

Поле, яке зареєструвало одну подію клавіатури, більше не є незайманою (не більш незайманою) і тому забруднене навіки.


Як щодо вставки миші?
Mihai Răducanu

2
Це нічого не пояснює. Питання було "в чому різниця". Немає пояснення того, що ви маєте на увазі під дівою, і що ви маєте на увазі під брудним.
hogan

34

Обидві директиви, очевидно, служать одній і тій же цілі, і хоча здається, що рішення кутового колективу включити обидва заважають принципу DRY та додає корисне навантаження сторінки, все-таки досить практично, щоб вони були обома навколо. Легше стилізувати вхідні елементи, оскільки у вас є CS-файли та .ng-брудні для стилізації у файлах css. Я думаю, що це було основною причиною додавання обох директив.


19
+1 для факту .ng-pristineта .ng-dirtyдозволити різні стилі css - це здається найправильнішою причиною повторення
Стів

10

Як вже було сказано в попередніх відповідях, ng-pristineце означає, що поле не було змінено, тоді ng-dirtyяк для того, щоб сказати, що воно було змінено. Навіщо потрібно обоє?

Скажімо, у нас є форма з телефоном та адресою електронної пошти серед полів. Потрібен або телефон, або електронна пошта, і ви також повинні повідомити користувача, коли він отримає недійсні дані у кожному полі. Це можна досягти, використовуючи ng-dirtyта ng-pristineспільно:

<form name="myForm">
    <input name="email" ng-model="data.email" ng-required="!data.phone">
    <div class="error" 
         ng-show="myForm.email.$invalid && 
                  myForm.email.$pristine &&
                  myForm.phone.$pristine">Phone or e-mail required</div>
    <div class="error" 
         ng-show="myForm.email.$invalid && myForm.email.$dirty">
        E-mail is invalid
    </div>

    <input name="phone" ng-model="data.phone" ng-required="!data.email">
    <div class="error" 
         ng-show="myForm.phone.$invalid && 
                  myForm.email.$pristine &&
                  myForm.phone.$pristine">Phone or e-mail required</div>
    <div class="error" 
         ng-show="myForm.phone.$invalid && myForm.phone.$dirty">
        Phone is invalid
    </div>
</form>

1

ng-незайманий ($ pristine)

Boolean True, якщо форма / введення ще не використовувались ( не змінено користувачем )

нг-брудний ($ брудний)

Boolean True, якщо форма / вхід використана ( модифікована користувачем )


$ setDirty (); Встановлює форму в брудний стан. Цей метод можна викликати, щоб додати клас 'ng-dirty' та встановити форму в брудний стан (клас ng-бруд). Цей метод поширить поточний стан на батьківські форми.

$ setPristine (); Встановлює форму в первозданний стан. Цей метод встановлює $ первозданний стан форми істинним, $ брудний стан - хибним, видаляє клас ng-брудний і додає клас ng-незайманий. Крім того, він встановлює значення $, що передається $, на значення false. Цей метод також поширюється на всі елементи управління, що містяться в цій формі.

Повернення форми в незайманий стан часто корисне, коли ми хочемо «повторно використати» форму після збереження або скидання.

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