2013-12-16 81 views
2

隨着AngularJS指令,如果指令c有父標籤a
我喜歡這個angularjs指令要求A或B

require: '^a' 

但是,如果c要求父標記ab 我試圖與ctrls監視在鏈接功能,但沒有運氣。

require: ['?a', '?b'] 

我試過,但有錯誤

require: '?(a|b)' 

什麼語法時,指令要求ab

回答

2

您應該能夠使用

require: ['?^a', '?^b'] 

抓住一些家長都是可選的控制器。這將返回一個控制器數組,如果它們不存在,則返回null。您需要檢查是否有一個控制器已經提供。

取決於你爲什麼需要這一點,它可能是更好的給雙方的父母的指令中的相同的控制器名稱

​​

,然後用

require: '^myParent' 

要求它非選擇性兒童。

+0

Docs are [here](http://docs.angularjs.org/api/ng.$compile) – Andyrooger

1

基於Angular源代碼,無法在require屬性中執行此操作。 Angular只希望以下兩種選擇之一:

  1. 包含(^ /?/?^/empty)標誌和一個指令名稱組合的字符串。
  2. 匹配選項一中的條件的字符串數組。

因此,你可以得到最fanciest將是一些必需的父控制器和一些可選的父控制器的混合。

//AngularJS 1.2 

function getControllers(require, $element) { 
    var value, retrievalMethod = 'data', optional = false; 
    if (isString(require)) { 
     while((value = require.charAt(0)) == '^' || value == '?') { 
      require = require.substr(1); 
      if (value == '^') { 
       retrievalMethod = 'inheritedData'; 
      } 
      optional = optional || value == '?'; 
     } 

     value = $element[retrievalMethod]('$' + require + 'Controller'); 

     ... 

     if (!value && !optional) { 
      throw $compileMinErr('ctreq', 
       "Controller '{0}', required by directive '{1}', can't be found!", 
       require, directiveName); 
     } 
     return value; 
    } else if (isArray(require)) { 
     value = []; 
     forEach(require, function(require) { 
      value.push(getControllers(require, $element)); 
     }); 
    } 
    return value; 
}