【问题标题】:How to correctly validate a non-input selector in AngularJS?如何正确验证 AngularJS 中的非输入选择器?
【发布时间】:2018-07-10 00:14:22
【问题描述】:

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

<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 的存在进行更新。

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

【问题讨论】:

  • 可以发my-widget指令源码吗?

标签: javascript jquery angularjs html angular-components


【解决方案1】:

ng-required 和其他验证指令需要 ng-model 和 ngModelController 来实现它们的标准行为。

您需要更新您的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();
      });
    }
  };
};

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 2013-06-18
    • 2023-02-04
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多