【问题标题】:How can I check transcluded form's validity in directive?如何检查指令中嵌入形式的有效性?
【发布时间】:2016-08-09 13:38:20
【问题描述】:

重写此问题以便澄清

如何检查指令中嵌入形式的有效性? 我想在指令的link function 中检查myForm.$valid。我将在我的指令中注入不同类型的形式,或者以不同的形式使用我的指令,你可以说

困难在于范围是孤立的,并且没有以下答案对我有用。

请在此处找到完整的代码,

https://plnkr.co/edit/K3IrE5KVehWXFM9JEMvE?p=preview

我想在表单无效时禁用“保存”按钮。

【问题讨论】:

  • 您可以尝试从有效的 HTML 开始。 Span 不能包含 div 或表单。
  • 在这种情况下,html 标准没有任何区别。无论如何,你能提供一个工作小提琴吗?
  • 看看下面的教程code.realcrowd.com/…
  • 你应该看stackoverflow.com/questions/28677638/…(可能重复)
  • 我从您的代码中创建了一个 plunk,它似乎工作正常。请记住,只有当您的表单的有效性状态从有效变为无效或反之亦然时,它才会生成日志。

标签: javascript angularjs


【解决方案1】:

要回答您的主要问题,您可以像任何其他模型值一样公开和绑定表单:

angular.module("main", [])
		.directive("formDirective", formDirective);

function formDirective() {
  return {
    restrict: "A",
    scope: {
      formModel: "=formModel"
    },
    link: function (scope, element, attrs) {
      scope.$watch("formModel.$valid", function (newValue, oldValue) {
       console.log(newValue, oldValue);
      });
    }
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="main">
	<div form-directive form-model="myForm">
	   <div>
	   <form name="myForm">
	      <div>
	      	<input type="text" ng-model="name" required="required">
	      </div>
         Valid: {{myForm.$valid}}
	   </form>
	   <div>
	</div>
</div>

但是,从我们的聊天对话中可以清楚地看出,您的整体问题更加复杂。

我在这里添加了一个工作示例:https://plnkr.co/edit/lkfdmc0PLRadfYFVhFAm?p=preview

这里要实现的关键方面是:

  • 您正在使用$uibModal.open 打开一个模态对话框,它将实例化引用的控制器editCtrl 并加载您的模板editCtrl.html
  • 加载过程包括 Angular 正在编译模板。该模板在根级别包含一个指令,因此该指令也需要编译。
  • 该指令使用嵌入并加载模板dialog.html。需要注意的是,您的 esDlg 指令的范围现在在 dialog.html 的模板中可用,因此您可以访问在指令声明的 scope 中定义的所有属性。
    您已经在对话框标题和文本中使用了它。
  • 我们需要做的就是在这里也绑定有效性信息,这样我们就可以在对话框中使用它了。

【讨论】:

    【解决方案2】:

    angular.module("main", [])
    		.directive("formDirective", formDirective);
    
    function formDirective() {
      return {
        restrict: "A",
        scope: {
          formModel: "=name"
        },
        link: function (scope, element, attrs) {
          scope.$watch("formModel.$valid", function (newValue, oldValue) {
           console.log(newValue, oldValue);
          });
        }
      }
    }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="main">
    	<div my-directive>
    	   <div>
    	   <form name="myForm" form-directive>
    	      <div>
    	      	<input type="text" ng-model="name" required="required">
    	      </div>
             Valid: {{myForm.$valid}}
    	   </form>
    	   <div>
    	</div>
    </div>

    我建议你使用angular-auto-validate

    【讨论】:

    • myForm 在范围内来自哪里。$watch 函数? :S
    • 对不起,我首先误解了你的问题。只是重写了答案
    • 嗨,我有一个孤立的范围,请检查我添加的 plunker,抱歉我之前应该提到它,但我是 angular 新手,所以不太了解它
    • @Mathematics 你想在你的对话框模板中使用“dlgNegClick”函数吗?我不明白你的问题。你想用什么来检查表格是否有效?上面的代码工作得很好......你可以使用attrs变量动态获取表单的名称,检查编辑的sn-p
    • 请看范围,你的范围没有声明,我的被隔离了
    【解决方案3】:

    您是否正确定义了指令?看看这个plunkervalidity 的记录如您所愿。

    function MyDirective() {
      return {
        restrict: 'AE',
        scope: true,
        link: function (scope, element, attrs) {
          scope.$watch('myForm.$valid', function (validity) {
            console.log(validity);
          });
        }
      }
    }
    

    【讨论】:

    • 嗨,我有一个孤立的范围,请检查我添加的 plunker,抱歉我之前应该提到它,但我是 angular 新手,所以不太了解它
    【解决方案4】:

    我从您的代码中创建了一个 plunk,它似乎工作正常。请记住,只有当您的表单的有效性状态从有效变为无效或反之亦然时,它才会生成日志。

    https://plnkr.co/edit/lW3e4p

      <div ng-app="my-app">
        <div ng-controller="testCtrl">
          <div my-directive>
             <form name="myForm">
               <input type="number" step="0.01" ng-model="rate" required>
             </form>
          </div>
        </div>
      </div>
    

    角度:

    angular.module('my-app').directive('myDirective', function() {
      return {
        link: function(scope, element, attr, mCtrl) {
          scope.$watch('myForm.$valid', function(validity) {
            console.log(validity);
          })
        }
      };
    });
    

    【讨论】:

    • 嗨,我有一个孤立的范围,请检查我添加的 plunker,抱歉我之前应该提到它,但我是 angular 新手,所以不太了解它
    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2020-10-21
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多