【问题标题】:Jquery-steps -- How to trigger ng-messages validation from controller js codeJquery-steps -- 如何从控制器 js 代码触发 ng-messages 验证
【发布时间】:2017-08-06 12:51:45
【问题描述】:

我有一个表单,它的组件绑定到ng-messages 验证系统,并使用jquery-steps 分为几个部分。

当用户按jquery-steps 按钮从一个部分导航到另一个部分时,我需要触发验证。这些是简单的按钮,不提交表单。在代码中,就是绑定了section之间的导航,我可以清楚的看到数据是否输入,是否正确:比如我可以成功引用$scope.eventForm.title.$valid。但是,我想在数据不正确时强制显示验证消息。目前它们仅在我单击任一输入后才会出现,但我想从控制器触发它们。有可能吗?

视图的html:

<div ng-controller="eventDetailsController as ctrl" ng-cloak>
  <md-content class="md-padding" layout-xs="column" layout="row" layout-align="center center">
    <div flex-xs flex-gt-xs="70" layout="column">
      <form name="eventForm">
        <div wizard="{content: '#format-toolbar-options', position: 'top'}" id="event_wizard">

          <h3>Basic data</h3>
          <section>

            <md-card>
              <img ng-src="{{imagePath}}" class="md-card-image" alt="Washed Out"/>
              <md-card-title>
                <md-card-title-text>
                  <h3>New event</h3>
                </md-card-title-text>
              </md-card-title>
              <md-card-content>

                <div layout="row">
                  <md-input-container class="md-block" flex="50">
                    <label>Title</label>
                    <input md-maxlength="30" required md-no-asterisk name="title" ng-model="event.title">
                    <div ng-messages="eventForm.title.$error">
                      <div ng-message="required">This is required.</div>
                      <div ng-message="md-maxlength">The title must be less than 30 characters long.</div>
                    </div>
                  </md-input-container>
                </div>

                <div layout="row">
                  <md-input-container class="md-block">
                    <label>Contacts</label>
                    <input required type="email" name="contacts" ng-model="event.contacts"
                minlength="10"  maxlength="100" ng-pattern="/^.+@.+\..+$/" />

                    <div ng-messages="eventForm.contacts.$error" role="alert">
                      <div ng-message-exp="['required', 'minlength', 'maxlength', 'pattern']">
                        Your email must be between 10 and 100 characters long and look like an e-mail address.
                      </div>
                    </div>
                  </md-input-container>
                </div>

              </md-card-content>
           </md-card>
          </section>

          <h3>Some other data</h3>
          <section>
          </section>

        </div>
      </form>
    </div>
  </md-content>
</div>

具有节间导航功能的控制器:

var eventDetailsController = function($scope, $http, __config){

    $scope.stepChanging = function(event, currentIndex, newIndex)
    {
        var valid = true;
        if(!$scope.eventForm.contacts.$valid)
        {
            //call some function which triggers contacts validation message
            //tried this as suggested in one of SO posts, but it did not work out
            $scope.eventForm.contacts.$setTouched();
            valid = false;
        }
        if(!$scope.eventForm.title.$valid)
        {
            //call some function which triggers title validation message
            valid = false;
        }

        //call some function which triggers all validation messages

        return valid;
    }
};

【问题讨论】:

  • 当您将 jQuery 插件(例如 jquery-steps)与 AngularJS 混合使用时,您会感到非常头疼。所写的问题没有提供足够的信息来重现问题。
  • 创建了这个插件:plnkr.co/edit/Allj9kGU3HpwxaOtX0Yd,问题可以清楚地重现:“下一步”按钮不会在“标题”输入下触发错误消息,除非之前已单击输入。关于插件:是的,我确实意识到了这一点,并且我清除了除 jquery-steps 之外的所有 jq 插件,因为这个非常方便。
  • 演示从不调用控制器中的$scope.stepChanging 函数。问题不存在。它与尝试将 jquery-steps 与 AngularJS 集成的指令一起使用。
  • 更新了演示,从函数登录到控制台。在我的情况下(我使用 Chrome 60.0.3112.90)该函数被正确调用并且日志记录 - 完成。你能提供你的浏览器版本吗?如果该浏览器版本是这样,那比我所说的问题要严重得多。

标签: angularjs validation angular-ngmodel jquery-steps ng-messages


【解决方案1】:

使用$validate()函数:

$scope.eventForm.contacts.$validate();
$scope.eventForm.title.$validate();

来自文档:

$validate();

运行每个已注册的验证器(首先是同步验证器,然后是异步验证器)。如果有效性更改为无效,则模型将设置为undefined。如果有效性更改为有效,它会将模型设置为最后一个可用的有效$modelValue,即最后一个解析值或从范围中设置的最后一个值。

— AngularJS ngModelController API Reference - $validate

【讨论】:

  • 感谢您的建议!但是由于某种原因它没有成功,尽管输入的有效性状态是可观察的并且是错误的,但仍然没有显示错误消息。现在我怀疑我输入的“必需”属性与其他 ng-messages 功能有某种冲突
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2014-08-11
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
相关资源
最近更新 更多