2013-12-16 2 views
2

С директивой AngularJS, если директива c имеет родительский тег a,
я как этотдиректива angularjs требует А или В

require: '^a' 

Однако, если c требует родительского тега a или b Я попытался это с Ctrls в функции связи, но не повезло.

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

Я попытался это, но с ошибкой

require: '?(a|b)' 

Что такое синтаксис, когда директива требует a или b?

ответ

2

Вы должны быть в состоянии использовать

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

, чтобы захватить оба дополнительных контроллеров от какой-то из родителей. Это вернет вам массив контроллеров или null, если они не существуют. Вам нужно будет проверить, был ли предоставлен один контроллер или нет.

В зависимости от того, почему вам это нужно, это может быть лучше, чтобы дать оба родителя директивы такое же имя контроллера

name: 'myParent' 

, а затем требовать его без необходимости с

require: '^myParent' 

в ребенок.

+0

Документы [здесь] (http://docs.angularjs.org/api/ng.$compile) – Andyrooger

1

Невозможно сделать это в собственности require, основанной на угловом исходном коде. Угловой только один из двух вариантов:

  1. Строка, содержащая комбинацию флага (^ /? /? ^/Пустой) и имя одной директивы.
  2. Массив строк, соответствующих критериям в опции номер один.

Таким образом, самым свежим вы могли бы стать сочетание некоторых требуемых родительских контроллеров и некоторых дополнительных родительских контроллеров.

//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; 
} 
Смежные вопросы