【问题标题】:AngularJS - perform extra validation on form submitAngularJS - 对表单提交执行额外的验证
【发布时间】:2018-02-08 09:54:39
【问题描述】:

我已经在谷歌上搜索了一段时间,似乎无法为我的具体案例找到一个好的答案。我找到了进行实时验证的方法,但我想在用户单击“提交”后将其与一些自定义验证结合起来。我想让用户仍然点击提交,即使它无效但我会在代码中取消提交。取以下代码:

<form name="cashForm" id="cashForm" novalidate>
  <input type="text" id="name" required /> //
  <input type="number" placeholder="Tax: " required name="tax" id="tax" />
  <input type="number" placeholder="Tip: " required name="tip" id="tip" />
  <button ng-click="submission()" ng-disabled="paymentForm.$invalid">Submit</button>
</form>


//inside controller
this.submission = function() {
  //check if tip + tax is over 20
  //prevent form and show error message if not
  //otherwise allow default behavior
}

所以我只希望在税/小费超过 10 的情况下实际提交表单。如何检查这一点,如果表单不符合要求,如何阻止提交?另外,我会把这个逻辑放在控制器中吗?

【问题讨论】:

    标签: angularjs forms angular-ui-router submit


    【解决方案1】:

    在我看来,它与您所追求的非常接近。只是几件事......

    ng-model 指令添加到您的输入控件以创建双向数据绑定,您可以在控制器中获取和使用:

    <form name="cashForm" id="cashForm" novalidate>
        <input id="name" name="name" type="text" ng-model="nameValue" required />
        <input id="tax" name="tax" type="number" ng-model="taxValue" placeholder="Tax: " required   />
        <input id="tip" name="tip" type="number" ng-model="tipValue" placeholder="Tip: " required />
        <button 
            ng-click="submission()" 
            ng-disabled="paymentForm.$invalid"> 
            Submit 
        </button>
    

    $scope 注入您的控制器,以便您在控制器的submission 方法中获取那些ng-model 绑定:

    function submission() {
    
        $scope.errorMsg = "";
    
        if ($scope.taxValue <= 10) {
            $scope.errorMsg = "tax not greater than 10";
            return;
        }
    
        if ($scope.tipValue <= 10) {
            $scope.errorMsg = "tip not greater than 10";
            return;
        }
    
        // If you reached here your post-click validation passed, 
        // so continue to submit the data...
    
     }
    

    然后您可以使用带有突出显示错误消息的 css 类的 ng-if 指令显示错误消息:

    <div ng-if="!!errorMessage" class="text-danger">
        {{ errorMessage }}
    </div>
    

    最后,一旦您在控制器中使用 $scope 破解了,您可能想了解使用 $scope 的感知弊端,并考虑改用控制器作为语法。查看 John Papa 的博文AngularJS's Controller As and the vm Variable

    【讨论】:

    • 谢谢马修。我认为这应该让我达到一个好点。最后一个问题,控制器是放置这个逻辑的正确位置吗?我听说你不应该在控制器中放置太多逻辑,但似乎这是唯一有意义的地方。
    • 就个人而言,我认为在控制器中这很好,因为条件直接决定了视图模型 ($scope) 填充的内容,即哪些错误消息。确实,您应该尽量使控制器保持精简,如果我必须在控制器中进行大量滚动,我会感到不舒服,这可能意味着它做了太多事情。如果它失控,则考虑将所有“检查是否提交”逻辑抽象到自定义指令中,并创建您自己的自定义单击(提交)行为以替换按钮上的ng-click
    • 然后,如果您想变得真正聪明,请尝试通过传入一个包含确定是否允许提交的设置的配置对象来使自定义指令可重用。然后你可以重用它并比较容易地复制行为。时间的投资。
    • 谢谢马修。我会试一试,看看我能做些什么。顺便说一句,我使用的是“Controller As”,所以我不需要传入范围。
    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    相关资源
    最近更新 更多