2013-12-16 33 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; 
}