如何正确验证AngularJS中的非输入选择器?

时间:2018-01-31 00:47:29

标签: javascript jquery angularjs html5 angular-components

我有以下格式(简化)的角形式:

<form name="form">
    <input ng-model="$ctrl.val1" ng-required="true" />
    <my-widget data-selected-value="$ctrl.myWidgetSelectedValue" ng-required="true"></my-widget>
    <input ng-model="$ctrl.val2" ng-required="true" />
</form>

虽然my-widget本身不包含输入,但它是一个更新myWidgetSelectedValue的专用选择器。虽然form。$ invalid基于其他输入的存在而正确更新,但我找不到根据myWidgetSelectedValue的存在进行更新的方法。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

ng-required和其他验证指令需要ng-modelngModelController来实现其标准行为。

您需要更新my-widget组件才能使用ng-model以获得使用标准指令(例如ng-required)的好处。基本上,将data-selected-value="..."属性更改为使用ng-model="..."并更新控制器/链接功能以使用ngModelController生命周期。

我之前已经在其他问题上发布了此信息,但我建议您查看此视频,了解如何在自定义组件中使用ngModel:Jason Aden - Using ngModelController to Make Sexy Custom Components因为它直接相关你想做什么。

更新myWidget组件以使用ng-model的过程是特定于实现的。如果您发布有关该组件的更多信息,那么我们可以就您可能需要做的事情提供更多指导。

这是code for the ngRequired directive。您可以看到,如果它所在的元素缺少ng-model属性,它实际上并没有做任何事情:if (!ctrl) return;

var requiredDirective = function() {
  return {
    restrict: 'A',
    require: '?ngModel',
    link: function(scope, elm, attr, ctrl) {
      if (!ctrl) return;
      attr.required = true; // force truthy in case we are on non input element

      ctrl.$validators.required = function(modelValue, viewValue) {
        return !attr.required || !ctrl.$isEmpty(viewValue);
      };

      attr.$observe('required', function() {
        ctrl.$validate();
      });
    }
  };
};