如何访问具有隔离范围的指令attrs?

时间:2013-05-07 14:06:30

标签: javascript angularjs angularjs-directive angularjs-scope

我需要访问由指令创建的模型,同时我需要在指令中获取attrs。

JS:

module.directive('createControl', function($compile, $timeout){
 return {            
   scope: {        
     name: '=Name' // Dynamically created ng-model in the directive element
   },
   link: function(scope, element, attrs){
     attrs.$observe('createControl', function(){
       attrs.createControl //is empty if scope is an object, otherwise it is passed from html attribute
     }
   }

HTML:

<div class="control-group" ng-repeat="x in selectedControls">
  <div create-control="{{ x }}"></div>
</div>

如果将scope定义为对象,则attrs为空,否则为从html传递的值。

这种行为的原因是什么?如何访问传递的attrs和模型?

3 个答案:

答案 0 :(得分:3)

问题: create-control需要在父作用域内评估{{x}},但是在声明指令时将scope作为对象,您创建了一个隔离范围。这意味着attrs.createControl无法访问x。因此,它是空的。

一个解决方案:您可以通过多种方式解决此问题,其中最好的方法是通过属性将您的指令配置为接受scope.createControl进入其隔离范围。

工作小提琴: http://jsfiddle.net/pvtpenguin/tABt6/

myApp.directive('createControl', function ($compile, $timeout) {
    return {
        scope: {
            name: '@', // Dynamically created ng-model in the directive element
            createControl: '@'
        },
        link: function (scope, element, attrs) {
            scope.$watch('createControl', function () {
                // the following two statements are equivalent
                console.log(attrs.createControl);
                console.log(scope.createControl);
            })
        }
    }
})

答案 1 :(得分:1)

同意Matt,但只有在设置了attrs时,以下两个声明才是等效的。

  

的console.log(attrs.createControl);

     

的console.log(scope.createControl);

否则,attrs.createControl将被取消定义,但scope.createControl将定义一个函数。

答案 2 :(得分:0)

  

我需要访问由指令

创建的模型
module.directive('createControl', function($compile, $timeout){

    return {            
        ...
        require:'ngModel',
        link:function(scope, element, attrs, ngMdlCntrl){
            //You have the access to the model of your directive here thr. ngMdlCntrl
        }
        ...
    }})

需求ng-model适用于您动态设置的模型。