27

我正在尝试使用指令来创建多个标签并将其附加到 a<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,我不明白为什么。实际问题:如何将范围变量传递给指令?

4

3 回答 3

34
    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>
于 2013-04-26T10:22:03.817 回答
15

如果v.type可能发生变化(即,您确实需要使用插值 - {{}}),请使用@charlietfl 或@Joe 的答案,具体取决于您希望指令具有的范围类型。

如果v.type不会改变(即你的链接函数只需要获取一次值,并且这些值保证在你的链接函数运行时被设置),你可以使用$parse$eval代替。这具有轻微的性能优势,因为没有创建 $watches。(使用$observe()=,Angular 设置了 $watches,每个摘要周期都会对其进行评估。)

<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);
    }
});

demo

于 2013-04-26T15:38:29.493 回答
15

阅读指令 docs的Attributes/observing interpolated attributes部分。在链接阶段,尚未设置属性。

有几种方法,包括使用attrs.$observeor $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

于 2013-04-26T10:04:38.910 回答