为何指令require指定ngModel不报错,指定ngSandy却报缺失控制器?
这个问题我之前做Angular项目时也踩过坑,核心原因和Angular指令require配置的底层逻辑直接相关,咱们来理清楚:
require配置的本质:它的作用是让当前指令获取另一个已定义指令的控制器实例,用于指令间的交互。这意味着你require的名称必须对应一个存在的Angular指令,而且这个指令必须有自己的控制器(不管是内置的还是自定义的)。为什么
ngModel能正常运行?ngModel是Angular内置的核心指令,它本身就封装了ngModelController控制器。当你在<input>上使用ng-model="data"时,Angular会自动初始化ngModel指令及其控制器,你的validNumber指令通过require: 'ngModel'就能成功获取到这个控制器实例,所以编译正常。为什么
ngSandy会抛出编译错误?
你只是在<input>上添加了ng-sandy="data"这个属性,但并没有定义对应的ngSandyAngular指令,更没有为这个指令编写控制器逻辑。Angular在编译阶段找不到require: 'ngSandy'对应的指令及其控制器,自然就会抛出$compile:ctreq Missing Required Controller错误——它找不到你要求依赖的那个控制器。如果想让
ngSandy生效该怎么做?
你需要先定义一个名为ngSandy的自定义指令(注意Angular指令的驼峰命名对应DOM中的短横线格式,所以指令名ngSandy对应DOM属性ng-sandy),并且在指令中定义控制器,示例代码如下:
angular.module('yourAppModule').directive('ngSandy', function() { return { // 定义控制器,供其他指令调用 controller: function($scope) { // 这里可以添加控制器的逻辑方法 this.someMethod = function() { // 示例逻辑 }; }, // 绑定数据到作用域 scope: { ngSandy: '=' } }; });
定义好这个指令后,当你在<input>上使用ng-sandy="data"时,Angular会初始化ngSandy指令及其控制器,你的validNumber指令就能通过require: 'ngSandy'成功获取到控制器实例,编译错误就会消失。
内容的提问来源于stack exchange,提问作者Sandy

