2014-02-16 56 views
14

这里发生了什么?无法找到指令'...'所需的控制器'ngModel'

这里是我的指令:

// 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> 

下面是实际的错误文本:

错误:[$编译: 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 在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 在范围$ get.Scope $的eval(http://www.domain.ca/Scripts/angular/angular.js:11634:28) 在范围$ get.Scope $申请(http://www.domain.ca/Scripts/angular/angular.js:11734:23)angular.js:9159 (匿名函数)angular.js:9159 $得到angular.js:6751 nodeLinkFn angular.js:6141个 compositeLinkFn angular.js:5550 nodeLinkFn angular.js:6132 compositeLinkFn angular.js:5550 publicLinkFn角。 JS:5458 (匿名函数)angular.js:1299 $ get.Scope $ EVAL angular.js:11634 $ get.Scope $适用angular.js:11734 (匿名函数)angular.js:1297 invoke 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个 事件处理器angular.js:2578ar.js:7874

回答

21

以防万一,那上面<input>片断不包含一个错字,这是问题:

the-model 

我们需要ng-model

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

角是用标准化/非规范化命名约定,这在结束是指:ng-model是如何表示ngModel的html方式。 HTML不区分大小写......并且这解决了这个问题

建议。如果我们用应用于一个要素多个指令工作:

  • 疯牛病的输入
  • 提交要求的

我们应该让他们都用标准输入设置工作。因此,两者都应该可以要求ng模型,作为如何访问传递给输入的模型的一种方式。

如果模型应该是代表不同的设置,这是绝对OK,我们只是没有跳过经过NG-模型以及

关于require

当你嵌套指令,它们需要相互沟通,通过一个控制器来做到这一点的方式是 。

其他指令可以有这个控制器传递给他们与需要财产 语法。都需要完整的形式如下:将需要串的

require: '^?directiveName' 

说明:

  • directiveName:这骆驼套管name指定该指令的控制器应从何而来。因此,如果我们的 指令需要在其父级上找到控制器,我们会将其编写为myMenu。
  • ^默认情况下,Angular从同一元素上的命名指令中获取控制器。添加这个可选的 ^符号表示还可以遍历DOM树来查找指令。例如,我们需要 添加此符号;最后的字符串将是\^myMenu。
  • ?如果没有找到需要的控制器,Angular会抛出一个异常来告诉您这个问题。添加 a?符号表示该控制器是可选的,并且如果找不到 ,则不应引发异常。虽然听起来不太可能,但如果我们想让s在没有容器的情况下使用,我们可以将这添加为最后一个需要的字符串?\^myMenu。
+0

模型和模型是故意的,因为想要将ngModel传递给具有双向数据绑定的指令。 –

+5

如果您使用require,则意味着:**其他指令可以将此控制器传递给它们**。因此,属性require与其他指令不相关。我的意思是,如果你将设置'require:'ngModel'',那么HTML属性必须包含ng-model。链接函数,然后会在'ctrl'变量中接收该控制器,只需要 –

+0

我不明白最后一条评论。 '需要:'ngModel'是否意味着我们传递了一个ngModel控制器? –

相关问题