2014-06-10 194 views
0

以下代碼不起作用。顯然,我不能從child-dir訪問someFunction()AngularJS:從子指令訪問父範圍

這是從兒童指令訪問父範圍的問題嗎?如何做到這一點,當孩子的指令來自外部庫?

角/ HTML:

<parent-dir ng-controller="parentCtrl"> 
    <child-dir ng-click="someFunction()"> 
    </child-dir> 
</parent-dir> 

JS:

.controller('parentCtrl', function($scope) { 
    $scope.someFunction = function() { 
    console.log('hello'); 
    } 
} 

回答

1

的問題是,你的child-dir創造了一個孤立的範圍從parent-dir

在您的指令聲明中,如果指定範圍等於true,則您將有權訪問父範圍。你會這樣做:

directive("child-dir", [ 
    function() { 
     return { 
      restrict: 'A', 
      scope: true, 
      link: function(scope, elem, attrs){ 
        } 
      }; 
     } 
]); 
2

你需要在這裏提供你的指令。很可能你正在使用一個隔離作用域來打破作用域的父子鏈。我的猜測是,你有這樣的事情:

angular.module('module').directive('childDir', [function() { 
    return { 
    scope: { 
     // Having scope defined as an object makes it an 'isolate' scope 
     // and breaks the chain between this scope and the parent scope. 
    } 
    }; 
}]; 

爲了解決這個問題,你可以訪問父控制器直接像這樣:

angular.module('module').directive('childDir', [function() { 
    return { 
    require: '^parentCtrl', 
    link: function ($scope, $element, $attrs, parentCtrl) { 
     $scope.someFunction = parentCtrl.someFunction; // of course this only works if you make someFunction a public function on the parentCtrl 
    }, 
    scope: { 
     // Having scope defined as an object makes it an 'isolate' scope 
     // and breaks the chain between this scope and the parent scope. 
    } 
    }; 
}]; 

或者,您可以通過不使你的範圍不分離在你的指令定義中返回一個'範圍'鍵或者將它設置爲{scope:true}(這會給你一個新的子範圍)。另一種選擇是通過直接訪問父範圍(而不是依賴原型繼承)來打破孤立障礙,如下所示:$ scope。$ parent.someFunction()。