2015-01-14 4 views
0

Предположим, у меня есть несколько директив: «драма», «комедия» и по какой-то причине у них много разных свойств, поэтому не обязательно иметь «фильм», директивы. Есть ли способ динамически оценивать директиву на основе переменной области? Что-то вроде этого:Угловая JS - динамически оценивать директиву

<{{movieType}} movie="{{movie}}"></{{movieType}}> 

Где бы оценить что-то вроде этого:

<comedy movie={{movie}}></comedy> 

Я новичок в Угловое, поэтому простите за сумасшедшие идеи.

UPDATE: На самом деле просто нашел аккуратную статью о том же проблемы/решения: http://onehungrymind.com/angularjs-dynamic-templates/

В основном автор имеет одну директиву, но свопы из шаблонов на основе запроса:

var getTemplate = function(contentType) { 
    var template = ''; 

    switch(contentType) { 
     case 'image': 
      template = imageTemplate; 
      break; 
     case 'video': 
      template = videoTemplate; 
      break; 
     case 'notes': 
      template = noteTemplate; 
      break; 
    } 

    return template; 
} 

return {template: getTemplate(type)}; 
+2

Вы не можете этого сделать, вам нужно будет скомпилировать элемент и добавить его. – PSL

+0

Итак, тогда я должен просто создать директиву «фильм» и установить ng-переключатель для разных типов фильмов и вложенных директив для каждой категории фильмов? –

+0

Каковы различные варианты, которые могут быть переданы? Они все еще фильмы, не так ли? Я бы все же исследовал возможность наличия единственной директивы кино и передачи всех параметров, тогда вы можете ng-if или ng-show определенные разделы, основываясь на том, есть ли параметры ввода. Я предполагаю, что они будут настолько похожи, что сохранение отдельных директив будет кошмаром для обслуживания. –

ответ

1

Вы можете использовать шаблон функции внутри директивы:

app.directive('movie', function(){ 
     return { 
      restrict:'A', 
      template: function(element, attr){ 
       ... define templates, i.e. <comedy /> 
       var contentType = attr.movie; 
       switch(contentType) { 
         case 'comedy': 
          template = comedyTemplate; 
          break; 
         case 'drama': 
          template = dramaTemplate; 
          break; 
         case 'suspense': 
           template = suspenseTemplate; 
          break; 
        } 
       return template; 
      } 
     } 
}) 

с этим решение, ручная компиляция не требуется.

Смежные вопросы