我正在按照教程试图获得需要ngModel
的工作指令:
app.directive("contenteditable", function() {
return {
restrict: "A",
require: "ngModel",
/* etc. */
这无法加载说:
无法找到指令'contenteditable'所需的控制器'ngModel'!
查看类似的代码in the angular docs,我更改了require
行:
require: "?ngModel"
现在它运作正常。我猜测?
使它成为可选项,但这对我来说没有多大意义。什么是问号做(如果不明显)为什么它允许指令工作?
答案 0 :(得分:40)
这正是您所猜测的:?
使指令可选。
基本上,在定义指令要求时,您可以使用它们:
someDirective
:在同一元素上需要someDirective并将其传递给链接函数?someDirective
:将someDirective控制器(如果在同一元素上可用)传递给链接函数。如果没有,请传递null。^someDirective
:在其中一个父元素上需要someDirective并将其传递给链接函数。?^someDirective
:如果某个父元素可用,则将someDirective控制器传递给链接函数。如果没有,请传递null。如果你的指令需要多个其他指令,你可以使用相同的东西但是传递一个如下数组:
require: ['firstRequiredDirective', '^secondRequiredDirective']
这一次,您将获得一系列必需的指令控制器传递给您的链接功能。
在您的情况下,如果具有contenteditable
指令的元素具有ngModel
,则ngModelController将传递给您的链接函数。
如果没有ngModel
指令,它将通过null
。
答案 1 :(得分:31)
只需添加@Igor Pantovic关于AngularJS $compile guide前缀^
前缀的更多详细信息:
(无前缀) - 在当前元素上找到所需的控制器。如果找不到则抛出错误。
? - 尝试找到所需的控制器,或者如果未找到,则将null传递给链接fn。
- ^ - 通过搜索元素及其父元素来定位所需的控制器。如果找不到则抛出错误。
- ^^ - 通过搜索元素的父级来找到所需的控制器。如果找不到则抛出错误。
- ?^ - 尝试通过搜索元素及其父元素来找到所需的控制器,或者如果找不到则将null传递给链接fn。
- ?^^ - 尝试通过搜索元素的父级来找到所需的控制器,或者如果找不到则将null传递给链接fn。
答案 2 :(得分:1)
你是正确的?
使必需的指令可选。这意味着null将在该需求的指令的link函数中返回。您使用它的方式表明ngModel
可能与contenteditable
在同一元素上,但实际上并不需要它。