在AngularJS中,ng-pristine和ng-dirty有什么区别?


109

ng-pristine和之间有什么区别ng-dirty?似乎你们两个都可以成为true

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

Answers:


214

ng-dirty班告诉你,形式已经被用户修改,而ng-pristine类告诉你的形式还没有被用户修改。所以,ng-dirtyng-pristine是同一故事的两个方面。

这些类被设置在任意字段中,而形式具有两个属性,$dirty$pristine

您可以使用该$scope.form.$setPristine()函数将表单重置为原始状态(请注意,这是AngularJS 1.1.x功能)。

如果$scope.form.$setPristine()甚至在AngularJS的1.0.x分支中也想要-ish行为,则需要推出自己的解决方案(可以在此处找到一些非常好的解决方案)。基本上,这意味着遍历所有表单字段并将其$dirty标志设置为false

希望这可以帮助。


2
好的答案,但是如果两个班级是同一故事的两个方面,那又为什么呢?就像我说的那样,您可能同时拥有真假。
2013年

6
是的,但是我猜(害怕)这是只有AngularJS开发人员才能回答的问题。换句话说:我不知道。
Golo Roden

2
@synergetic基本上就像ng-show和ng-hide一样,一个就足够了,但是我们有两个原因不明
Labib Ismaiel 2014年

1
@synergetic ng-show在语义上更易于理解,并且比!ng-hide少了一个认知步骤。您的大脑需要执行额外的步骤,因此您更有可能引入错误
Damian Green

4
我认为这取决于您的意图:有时,您想在特定情况下显示其他内容,有时您需要在特定情况下隐藏一些内容。根据您的用例,两者可能都合适。当然,尽管从技术上讲完全相同,但有意并非如此。
Golo Roden 2014年

42

pristine告诉我们某个字段是否仍为纯文本,dirty告诉我们该用户是否已在相关字段中输入了任何内容:

<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>

注册了单个keydown事件的字段不再是原始数据(不再是原始数据),因此永远是肮脏的。


用鼠标粘贴怎么样?
MihaiRăducanu16年

2
这什么也没解释。问题是“有什么区别”。没有关于“处女”和“肮脏”的解释。
hogan

34

这两个指令显然具有相同的目的,尽管似乎角度小组决定同时包含这两个指令会干扰DRY原理并增加页面的有效负载,但同时使用这两个指令仍然是相当实用的。由于您可以在CSS文件中同时设置.ng-pristine和.ng-dirty的样式,因此可以更轻松地设置输入元素的样式。我想这是添加两个指令的主要原因。


19
为事实+1,.ng-pristine.ng-dirty允许使用不同的CSS样式-这似乎是重新安置背后的最正确原因
Steve Lorimer

10

如先前答案中所述,ng-pristine用于指示该字段尚未修改,而用于指示该字段ng-dirty已修改。为什么两者都需要?

假设我们有一个表格,其中包含电话和电子邮件地址。需要电话或电子邮件,并且当用户在每个字段中都有无效数据时,还必须通知用户。这可以通过ng-dirtyng-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 ($ pristine)

布尔值真如果表单/输入还没有被使用,但(不是由用户修改

ng-dirty ($ dirty)

布尔值真如果表单/输入已经被使用(被用户修改


$ setDirty(); 将表单设置为脏状态。可以调用此方法以添加'ng-dirty'类并将表单设置为脏状态(ng-dirty类)。此方法会将当前状态传播到父窗体。

$ setPristine(); 将表单设置为原始状态。此方法将窗体的$ pristine状态设置为true,将$ dirty状态设置为false,删除ng-dirty类并添加ng-pristine类。此外,它将$ submitted状态设置为false。此方法还将传播到此窗体中包含的所有控件。

当我们要在保存或重置表单后“重用”表单时,将表单重新设置为原始状态通常很有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.