【问题标题】:In AngularJS, what's the difference between ng-pristine and ng-dirty?在 AngularJS 中,ng-pristine 和 ng-dirty 有什么区别?
【发布时间】:2013-08-06 06:38:23
【问题描述】:

ng-pristineng-dirty 有什么区别?看来你可以同时成为true

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

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    ng-dirty 类告诉您表单已被用户修改,而ng-pristine 类告诉您表单尚未被用户修改。所以ng-dirtyng-pristine 是同一个故事的两个方面。

    类设置在任何字段上,而表单有两个属性,$dirty$pristine

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

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

    希望这会有所帮助。

    【讨论】:

    • 很好的答案,但为什么有 2 个课程,如果它们是同一个故事的两个方面?正如我所说,你可以同时为真或假。
    • 没错,但我猜(害怕)这是一个只有 AngularJS 开发人员才能回答的问题。换句话说:我不知道。
    • @synergetic 基本上就像 ng-show 和 ng-hide,一个就足够了,但我们有两个没有明显的原因
    • @synergetic ng-show 在语义上更易于理解,并且比!ng-hide 需要更少的认知步骤来理解。你的大脑需要做额外的步骤,因此你更有可能引入错误
    • 我认为这取决于您的意图:有时,您想在特定情况下显示其他内容,有时您需要隐藏一些特定情况下的事情。根据您的用例,两者都可能适用。当然,虽然它在技术上是相同的,但故意不是。
    【解决方案2】:

    这两个指令显然服务于相同的目的,尽管 Angular 团队决定同时包含这两个指令似乎会干扰 DRY 原则并增加页面的有效负载,但同时使用它们仍然是相当实用的。由于 .ng-pristine 和 .ng-dirty 都可用于在 css 文件中进行样式设置,因此设置输入元素的样式会更容易。我想这是添加这两个指令的主要原因。

    【讨论】:

    • +1 表示 .ng-pristine.ng-dirty 允许不同的 css 样式 - 这似乎是重复背后最正确的原因
    【解决方案3】:

    ng-pristine ($pristine)

    Boolean 如果尚未使用表单/输入则为 True(用户未修改

    ng-dirty ($dirty)

    Boolean 如果表单/输入已被使用(由用户修改),则为 True


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

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

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

    【讨论】:

      【解决方案4】:

      正如之前的答案中已经说过的,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>
      

      【讨论】:

        【解决方案5】:

        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 事件的字段不再是原始的(不再是原始的),因此永远是脏的。

        【讨论】:

        • 用鼠标粘贴怎么样?
        • 这并不能解释什么。问题是“有什么区别”。没有解释你所说的处女和肮脏的意思。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        • 2015-01-11
        • 2012-09-07
        • 2016-02-17
        • 2013-04-17
        相关资源
        最近更新 更多