指令中的问号要求

jcu*_*nod 29 angularjs angularjs-directive

我正在按照教程试图获得要求的指令ngModel:

app.directive("contenteditable", function() {
    return {
        restrict: "A",
        require: "ngModel",
        /* etc. */
Run Code Online (Sandbox Code Playgroud)

这无法加载说:

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

查看角度文档中的类似代码,我改变了这一require行:

require: "?ngModel"
Run Code Online (Sandbox Code Playgroud)

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

Igo*_*vić 41

这正是你所猜到的:?使指令可选.

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

  1. someDirective :在同一元素上需要someDirective并将其传递给链接函数
  2. ?someDirective:将someDirective控制器(如果在相同元素上可用)传递给链接功能.如果不是,则传递null.
  3. ^someDirective :在其中一个父元素上需要someDirective并将其传递给链接函数.
  4. ?^someDirective:如果某个父元素可用,则将someDirective控制器传递给链接函数.如果不是,则传递null.

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

require: ['firstRequiredDirective', '^secondRequiredDirective']
Run Code Online (Sandbox Code Playgroud)

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

在您的情况下,如果具有您的contenteditable指令的元素具有ngModel,则ngModelController将传递给您的链接函数.

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


Eug*_*hel 31

只是为@Igor Pantovic添加更多关于AngularJS $编译指南^前缀的答案:

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

  • ? - 尝试找到所需的控制器或将null传递给链接fn(如果未找到).

  • ^ - 通过搜索元素及其父元素来定位所需的控制器.如果找不到则抛出错误.
  • ^^ - 通过搜索元素的父项找到所需的控制器.如果找不到则抛出错误.
  • ?^ - 尝试通过搜索元素及其父元素来定位所需的控制器,或者如果未找到则将null传递给链接fn.
  • ?^^ - 尝试通过搜索元素的父元素来定位所需的控制器,或者如果未找到则将null传递给链接fn.