指令中的问号要求

时间:2015-04-21 15:50:41

标签: angularjs angularjs-directive

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

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

这无法加载说:

  

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

查看类似的代码in the angular docs,我更改了require行:

require: "?ngModel"

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

3 个答案:

答案 0 :(得分:40)

这正是您所猜测的:?使指令可选。

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

  1. someDirective:在同一元素上需要someDirective并将其传递给链接函数
  2. ?someDirective:将someDirective控制器(如果在同一元素上可用)传递给链接函数。如果没有,请传递null。
  3. ^someDirective:在其中一个父元素上需要someDirective并将其传递给链接函数。
  4. ?^someDirective:如果某个父元素可用,则将someDirective控制器传递给链接函数。如果没有,请传递null。
  5. 如果你的指令需要多个其他指令,你可以使用相同的东西但是传递一个如下数组:

    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在同一元素上,但实际上并不需要它。