【问题标题】:Is it possible to pass 'required' into an AngularJS directive?是否可以将“必需”传递给 AngularJS 指令?
【发布时间】:2013-10-14 23:50:32
【问题描述】:

我正在制作一个自定义自动完成指令,该指令在其自身内部使用 <input>,但我在弄清楚如何向下传递“必需”属性以及其他具有我可以看到的值的属性时遇到了一些麻烦但无论是否设置,“必需”似乎都是空白的。我的回报声明的第一部分如下:

return {
            restrict: 'E',
            template: tpl,
            replace: true,
            scope: {
                suggestionsPath: '=autoComplete',
                method: '@method',
                term: '@term',
                required: '@required',
                ngModel: "="
            }...

谢谢!

【问题讨论】:

  • 你可以尝试ng-required,并在你的指令范围内尝试ngRequired
  • 您还可以查看链接函数中attrs.required 属性中的内容,看看是否有什么东西。
  • 您是否有理由为此需要隔离范围?它可能看起来更简单,但通常并非如此。如果您需要动态绑定,我建议对“ngModelController”提出不同的要求并使用“attrs”和 $scope.$watch。如果您想要更完整的解决方案,请告诉我,如果您发布 jsFiddle 或其他我会尽力提供帮助的内容。
  • @ChrisNicola 嘿,感谢您的回复。我正在使用隔离范围,因为角度文档说这最适合可重用组件,当然文档可能是错误的:) 我正在尝试将自动完成指令设计为“扩展”输入指令,因此它需要尽可能像输入一样发挥作用,即将其标记为需要并将其包含在验证例程中。
  • 如果你想扩展一个输入指令,那么我强烈推荐使用 ngModelController。我将发布一个基本的答案,我们可以来回走动。我不确切知道你的指令需要做什么,所以它可能不完整。

标签: javascript validation angularjs


【解决方案1】:

我已经为输入构建了一些扩展,扩展现有 ngModel 绑定的最佳(可以说)唯一方法是在指令中使用 ngModelController。您可以使用“require”属性来要求另一个指令的控制器。 documentation for ngModelController is here

这将允许您获取/设置模型值以及根据需要扩展或替换验证行为。因为您现在可能正在扩展 AngularJS 输入指令的组合,您可能还想查看 AngularJS 中的输入指令以了解其工作方式的示例。它们还可以与 ngFormController 作为整个表单的父级相切工作。这需要我一段时间才能掌握,所以请耐心等待,但这是迄今为止最好的方法。

我会避免在这里隔离作用域,它们可能很棘手,并不总是与其他指令配合得很好(所以通常只在新元素或只有一个指令本身存在的事物上使用它)。我会设计这样的东西:

return {
        restrict: 'E',
        template: tpl,
        replace: true,
        require: 'ngModel',
        link: function(scope, element, attrs, ngModelController) {
           // Use attrs to access values for attributes you have set on the lement
           // Use ngModelController to access the model value and add validation, parsing and formatting
           // If you have an attribute that takes an expression you can use the attrs value along with $scope.$watch to check for changes and evaluate it or the $parse service if you just want to evaluate it.
        }

我建议您尽可能熟悉指令设计,因为自定义输入可能会变得非常棘手,具体取决于它们的作用(我们已经构建了添加 +/- 按钮的自定义输入以及将数字格式化为百分比、货币或输入时只需带逗号的数字)。除了 ngModelController 文档之外,这些文档对查看也很有用:

【讨论】:

    【解决方案2】:

    Required 本身就是一个有趣的属性(参见此处Setting an attribute named "required" and any value, with JQuery, doesn't work)。你可能会在传递任何类型的值时遇到很多麻烦,因为它的效果取决于它是否存在,而不是它的值。不同的浏览器会区别对待,可能会重写值。

    您也会遇到麻烦,因为requiredngModel 都是指令,如果提供它们,它们将在您的元素上编译。 required 将与 ngModel 对话,如果你想让事情正常工作,你将需要实现 ngModel properly

    更简单的选择是将requiredngModel 重命名为其他名称。例如myRequiredmyNgModel。然后您可以将ng-model 直接绑定到scope.myNgModel 并将ng-required 绑定到myRequired

    【讨论】:

      【解决方案3】:

      我知道这是一个老问题,但对于其他前来寻找的人(这就是我最终来到这里的方式):

      您可以将 required 标记传递给指令以读取为布尔值,然后在 ng-required 中使用该值。

      return {
          restrict: 'E',
          template: tpl,
          replace: true,
          scope {
              required:'@'
          }
      

      然后在你的指令模板中你会使用它

      <input type="text" ng-required="required" />
      

      要么找到属性 'required',然后在指令中将其设置为 true,要么未找到将被 ng-required 解释为 false 值的属性

      【讨论】:

      • 正是我想要的。然后在您的 html 中,您可以添加“必需”或将其省略,并反映在指令中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 2015-08-31
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多