提问人:jcuenod 提问时间:4/21/2015 更新时间:11/27/2015 访问量:8990
指令 require 中的问号
Question Mark in Directive Require
问:
我正在遵循一个教程,试图获得一个需要的指令:ngModel
app.directive("contenteditable", function() {
return {
restrict: "A",
require: "ngModel",
/* etc. */
这无法加载说:
找不到指令“contenteditable”所需的控制器“ngModel”!
查看 angular 文档中的类似代码,我更改了以下行:require
require: "?ngModel"
现在它工作正常。我猜这使它成为可选的,但这对我来说没有多大意义。问号在做什么,(如果不明显)为什么它允许指令工作??
答:
这正是你所猜到的:使指令成为可选指令。?
基本上,在定义指令要求时,您可以使用这些:
someDirective
:需要对同一元素执行 someDirective 并将其传递给链接函数?someDirective
:将同一元素上的 someDirective 控制器(如果可用)传递给链接函数。如果没有,则传递 null。^someDirective
:在其中一个父元素上需要 someDirective 并将其传递给链接函数。?^someDirective
:将 someDirective 控制器(如果在其中一个父元素上可用)传递给链接函数。如果没有,则传递 null。
如果你的指令需要多个其他指令,你可以使用相同的方法,但传递一个数组,如下所示:
require: ['firstRequiredDirective', '^secondRequiredDirective']
这一次,你将获得一个传递给链接函数的必需指令控制器数组。
在你的例子中,如果具有指令的元素有 ,ngModelController 将被传递给你的链接函数。contenteditable
ngModel
如果没有指令,它将通过.ngModel
null
你是对的,使必需的指令成为可选的。这意味着将在该要求的指令的 link 函数中返回 null。您使用它的方式表明可能与相同的元素,但实际上并不是必需的。?
ngModel
contenteditable
只是为了添加更多细节@Igor Pantovic 对 AngularJS $compile指南中关于前缀的答案:^
(无前缀) - 在当前元素上找到所需的控制器。如果未找到,则抛出错误。
?- 尝试找到所需的控制器,如果未找到,则将 null 传递给链接 fn。
^ - 通过搜索元素及其父元素来找到所需的控制器。如果未找到,则抛出错误。
^^ - 通过搜索元素的父级来找到所需的控制器。如果未找到,则抛出错误。
?^ - 尝试通过搜索元素及其父元素来找到所需的控制器,如果未找到,则将 null 传递给链接 fn。
?^^ - 尝试通过搜索元素的父级来查找所需的控制器,如果未找到,则将 null 传递给链接 fn。
评论