如何在指令中检查跨封装表单的有效性?

How can I check transcluded form's validity in directive?

本文关键字:表单 封装 有效性 检查 指令      更新时间:2023-09-26

改写问题以澄清

如何在指令中检查跨封装表单的有效性?我想检查指令的link function中的myForm.$valid。我会在指令中注入不同的形式或者以不同的形式使用指令你可以输入

困难在于范围是孤立的,下面的答案对我来说都不起作用。

请在这里找到完整的代码,

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

预览

我想在表单无效时禁用"保存"按钮

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

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中定义的所有属性。你已经在对话框的标题和文本中使用了这个。
  • 我们所需要做的就是在这里绑定有效性信息,这样我们就可以在对话框中使用它。

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

您是否正确定义了指令?检查这个柱塞,validity被记录为您所期望的。

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

我从你的代码中创建了一个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);
      })
    }
  };
});