Подтвердить что ты не робот

Angularjs: как передать переменные области в директиву?

Я пытаюсь использовать директиву для создания и добавления нескольких тегов к <div>, как показано ниже:

module.directive('createControl', function(){
  return function(scope, element, attrs){    
    console.log(attrs.createControl); // undefined     
  }                                          
});                                         


<div class="control-group" ng-repeat="(k, v) in selectedControls">
  <div create-control="{{ v.type }}"></div>
</div>

В attrs у меня есть эта конструкция:

$$element: b.fn.b.init[1]
$$observers: Object
$attr: Object
createControl: "date"
style: "margin-right: 15px"
__proto__: Object

Но когда я пытаюсь использовать attrs.createControl, я получаю undefined, и я не понимаю, почему. Фактический вопрос: как передать переменную scope в директиву?

4b9b3361

Ответ 1

Прочитайте Атрибуты/наблюдения интерполированных атрибутов раздела директивных документов. Во время фазы ссылки атрибуты не были установлены.

Существует несколько способов использования attrs.$observe или $timeout.

app.directive('createControl', function($timeout){
 return function(scope, element, attrs){
      attrs.$observe('createControl',function(){
        console.log(' type:',attrs.createControl);
         element.text('Directive text, type is: '+attrs.createControl);
      });
  }
}) ;

DEMO

Ответ 2

    app.directive('createControl', function() {
      return {
        scope: {
          createControl:'='
        },
        link: function(scope, element, attrs){    
           element.text(scope.createControl);    
        }      
      }
    })  

  <div class="control-group" ng-repeat="v in [{type:'green'}, {type:'brown'}]">
    <div create-control="v.type"></div>
   </div>

Ответ 3

Если v.type может измениться (т.е. вам действительно нужно использовать интерполяцию - {{}} s), используйте @charlietfl или @Joe answser, в зависимости от типа области, которую вы хотите, чтобы ваша директива имела.

Если v.type не будет изменяться (т.е. ваша функция связи должна только получать значения один раз, и эти значения гарантированно будут установлены при запуске вашей функции ссылок), вы можете использовать $parse или $eval. Это имеет небольшое преимущество в производительности, так как часы не создаются. (С $observe() и =, Angular устанавливает $watch, которые оцениваются каждый цикл дайджеста.)

<div create-control="v.type"></div>
app.directive('createControl', function ($parse) {
    return function (scope, element, attrs) {
        console.log('$eval type:', scope.$eval(attrs.createControl));
        var type = $parse(attrs.createControl)(scope);
        console.log('$parse type:', type);
        element.text('Directive text, type is: ' + type);
    }
});

демонстрация