找不到指令“...”所需的控制器“ngModel”

Posted

技术标签:

【中文标题】找不到指令“...”所需的控制器“ngModel”【英文标题】:Controller 'ngModel', required by directive '…', can't be found 【发布时间】:2014-03-15 12:00:46 【问题描述】:

这是怎么回事?

这是我的指令:

// template <input ng-model="theModel"  />
app.directive('bseInput', function () 
    return 
        templateUrl: "/Scripts/bse/bse-inputs.html",
        scope:
        
            theModel: '=',
        ,
        compile: function compile(tElement, tAttrs, transclude) 

            // do stuff

        
    ;
);


app.directive('submitRequired', function (objSvc) 
    return 
        require: 'ngModel',
        link: function (scope, elm, attrs, ctrl) 

          // do something
        
    ;
);

以下是使用中的指令示例:

<input bse-input submit-required="true" the-model="someModel"></input>

这是实际的错误文本:

错误:[$compile:ctreq] 控制器“ngModel”,指令“submitRequired”需要,找不到! http://errors.angularjs.org/1.2.2/$compile/ctreq?p0=ngModel&p1=submitRequired 在http://www.domain.ca/Scripts/angular/angular.js:78:12 在 getControllers (http://www.domain.ca/Scripts/angular/angular.js:5972:19) 在 nodeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:6139:35) 在compositeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:5550:15) 在 nodeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:6132:24) 在compositeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:5550:15) 在 publicLinkFn (http://www.domain.ca/Scripts/angular/angular.js:5458:30) 在http://www.domain.ca/Scripts/angular/angular.js:1299:27 在 Scope.$get.Scope.$eval (http://www.domain.ca/Scripts/angular/angular.js:11634:28) 在 Scope.$get.Scope.$apply (http://www.domain.ca/Scripts/angular/angular.js:11734:23) angular.js:9159 (匿名函数)angular.js:9159 $get angular.js:6751 nodeLinkFn angular.js:6141 复合链接Fn angular.js:5550 nodeLinkFn angular.js:6132 复合链接Fn angular.js:5550 publicLinkFn angular.js:5458 (匿名函数)angular.js:1299 $get.Scope.$eval angular.js:11634 $get.Scope.$apply angular.js:11734 (匿名函数)angular.js:1297 调用 angular.js:3633 doBootstrap angular.js:1295 引导 angular.js:1309 angularInit angular.js:1258 (匿名函数)angular.js:20210 触发 angular.js:2315 (匿名函数)angular.js:2579 forEach angular.js:300 eventHandler angular.js:2578ar.js:7874

【问题讨论】:

【参考方案1】:

以防万一,上面的&lt;input&gt;sn-p 不包含错字,这就是问题所在:

the-model

我们需要ng-model

<input bse-input submit-required="true" ng-model="someModel.Property"></input>

angular 使用规范化/非规范化命名约定,最后意味着:ng-model 是如何表达ngModel 的html 方式。 HTML 不区分大小写...这解决了这个问题

建议。如果我们将多个指令应用于一个元素:

bse 输入 必填

我们应该让它们都使用标准 INPUT 设置。因此,两者都应该需要 ng-model,作为访问传递给输入的模型的一种方式。

如果模型应该代表不同的设置,这绝对没问题,我们也不必跳过传递 ng-model

关于require

当您有需要相互通信的嵌套指令时, 这是通过控制器来实现的。

其他指令可以通过 require 属性将此控制器传递给它们 句法。 require 的完整形式如下:

require: '^?directiveName'

require 字符串的解释:

directiveName:这个驼峰式名称指定控制器应该来自哪个指令。所以如果我们的 指令需要在其父级上找到一个控制器,我们将其写为 myMenu。 ^ 默认情况下,Angular 从同一元素上的命名指令获取控制器。添加此可选 ^ 符号表示还要沿着 DOM 树查找指令。例如,我们需要 添加此符号;最后的字符串是 \^myMenu。 ? 如果没有找到需要的控制器,Angular 会抛出异常告诉你问题所在。添加 一种 ?字符串的符号表示此控制器是可选的,如果不是,则不应抛出异常 成立。虽然听起来不太可能,但如果我们想让 s 不使用 容器,我们可以将其添加到最终需要的 ?\^myMenu 字符串中。

【讨论】:

如果你使用 require 这意味着:其他指令可以将此控制器传递给它们。因此,属性 require 与其他指令相关,而不与模型相关。我的意思是,如果您要设置require: 'ngModel',那么 HTML 属性必须包含 ng-model。链接函数,然后将在ctrl 变量中接收该控制器,只是需要 您会说,现在这一切都更有意义了吗?请,如果可以,请阅读此 docs.angularjs.org/guide/directive 指令的角度指南。那里对此进行了解释,请搜索:^myTabs。享受 Angular,这是一个了不起的工具 ;) 这里最大的技巧是 directivecontroller 在这种特殊情况下是相等的。看,我们可以从另一个指令中得到什么——实际上是另一个指令的控制器。我们无权访问其他指令“定义”......我们确实有权访问控制器。这就是我们在他们之间进行交流的方式。请阅读指令指南 - 它在那里;) 我的意思是,在这种情况下它们是平等的。当我们确实需要 ngModel 时,我们正在谈论 ngModel 指令,但我们将在运行时得到的是 ngModel 控制器……这是 angular 的设计方式 知道了。 require: 'ngModel' 表示ng-model 属性必须存在于标记中。 require 还意味着,在运行时,指令的link 函数将有权访问ngModel 指令的控制器。哇!谢谢!

以上是关于找不到指令“...”所需的控制器“ngModel”的主要内容,如果未能解决你的问题,请参考以下文章

Teamcity:错误 MSB3147:找不到所需的文件“setup.bin”

找不到连接到本地数据文件所需的数据提供者

Flutter 报错 Kotlin 找不到所需的 JDK 工具

找不到所需的文件 index.html - Heroku 推送错误

为啥打开程序是总是显示“找不到所需的.DLL文件”

在 Apple 的开发人员文档中找不到所需的 NSURLConnection 委托方法。为啥?