无法找到指令'...'所需的控制器'ngModel'

时间:2014-02-16 06:04:11

标签: angularjs directive

这里发生了什么?

以下是我的指示:

// 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]无法找到指令'submitRequired'所需的控制器'ngModel'! http://errors.angularjs.org/1.2.2/ $编译/ ctreq P0 = ngModel&安培; P1 = submitRequired     在http://www.domain.ca/Scripts/angular/angular.js:78:12     at getControllers(http://www.domain.ca/Scripts/angular/angular.js:5972:19)     at nodeLinkFn(http://www.domain.ca/Scripts/angular/angular.js:6139:35)     在compositeLinkFn(http://www.domain.ca/Scripts/angular/angular.js:5550:15)     at 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 compositeLinkFn angular.js:5550 nodeLinkFn angular.js:6132 compositeLinkFn 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 bootstrap 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 个答案:

答案 0 :(得分:22)

以防万一,以上<input>代码段不包含拼写错误,这就是问题所在:

the-model

我们需要ng-model

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

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

建议。如果我们正在处理应用于一个元素的多个指令:

  • bse-input
  • 提交要求的

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

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

关于require

当你有嵌套的指令需要相互通信时,就可以了 这是通过控制器。

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

require: '^?directiveName'

需求字符串的说明:

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