指令 require 中的问号

Question Mark in Directive Require

提问人:jcuenod 提问时间:4/21/2015 更新时间:11/27/2015 访问量:8990

问:

我正在遵循一个教程,试图获得一个需要的指令:ngModel

app.directive("contenteditable", function() {
    return {
        restrict: "A",
        require: "ngModel",
        /* etc. */

这无法加载说:

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

查看 angular 文档中的类似代码,我更改了以下行:require

require: "?ngModel"

现在它工作正常。我猜这使它成为可选的,但这对我来说没有多大意义。问号在做什么,(如果不明显)为什么它允许指令工作??

angularjs angularjs指令

评论


答:

44赞 Igor Pantović 4/22/2015 #1

这正是你所猜到的:使指令成为可选指令。?

基本上,在定义指令要求时,您可以使用这些:

  1. someDirective:需要对同一元素执行 someDirective 并将其传递给链接函数
  2. ?someDirective:将同一元素上的 someDirective 控制器(如果可用)传递给链接函数。如果没有,则传递 null。
  3. ^someDirective:在其中一个父元素上需要 someDirective 并将其传递给链接函数。
  4. ?^someDirective:将 someDirective 控制器(如果在其中一个父元素上可用)传递给链接函数。如果没有,则传递 null。

如果你的指令需要多个其他指令,你可以使用相同的方法,但传递一个数组,如下所示:

require: ['firstRequiredDirective', '^secondRequiredDirective']

这一次,你将获得一个传递给链接函数的必需指令控制器数组。

在你的例子中,如果具有指令的元素有 ,ngModelController 将被传递给你的链接函数。contenteditablengModel

如果没有指令,它将通过.ngModelnull

1赞 Enzey 4/22/2015 #2

你是对的,使必需的指令成为可选的。这意味着将在该要求的指令的 link 函数中返回 null。您使用它的方式表明可能与相同的元素,但实际上并不是必需的。?ngModelcontenteditable

33赞 Yauhen 11/27/2015 #3

只是为了添加更多细节@Igor Pantovic 对 AngularJS $compile指南中关于前缀的答案:^

  • (无前缀) - 在当前元素上找到所需的控制器。如果未找到,则抛出错误。

  • ?- 尝试找到所需的控制器,如果未找到,则将 null 传递给链接 fn。

  • ^ - 通过搜索元素及其父元素来找到所需的控制器。如果未找到,则抛出错误。

  • ^^ - 通过搜索元素的父级来找到所需的控制器。如果未找到,则抛出错误。

  • ?^ - 尝试通过搜索元素及其父元素来找到所需的控制器,如果未找到,则将 null 传递给链接 fn。

  • ?^^ - 尝试通过搜索元素的父级来查找所需的控制器,如果未找到,则将 null 传递给链接 fn。