2016-10-12 121 views
0

我想調用指令控制器上的功能,使用它的ID訪問的情況下,從父控制器:上調用指令控制器功能

<my-directive id="id1" /> 
var dirController = getDirectiveByID("id1"); 
dirController.someFunc(); 

在您看來,什麼是最簡單的方法這樣做? 我看過的大多數解決方案都很難看/很複雜。

感謝

回答

0

我能理解你想要什麼來實現的,不幸的是,如果你想從指令專門揭露控制器API,我知道正確的方法是在指令使用require但它是指令指令並僅向下。

由於您my-directive可以訪問父範圍,大概是從父作用域繼承,最簡單的方式來實現你想要的是初始化你的父母控制器

$scope.control = {}; 

那麼你myDirective追加內內的對象作爲控制接口你想暴露給那個控制接口的函數,例如

$scope.control.someFn = function() { 
    ... 
} 

從而在您的父母控制器,你應該能夠訪問那些你從指令曝光功能。

+0

布萊恩嗨, ŧ爲你的答覆。在我的指令中,我使用隔離範圍。在這種情況下是否可以訪問父控制器作用域? –

+0

父控制器範圍我的意思是頁面上的主控制器,而不是我可能需要的父指令。 –

+0

來自另一篇文章的一種可能性是: –

0

另一種解決方案是在控制器中註冊指令,然後激發你需要的功能(如觀察者模式)。

這裏有一個例子,你會發現它連接fiddle

<body ng-app="app"> 
    <div ng-controller="parentController" > 
    <h1> 
     {{title}} 
    </h1> 
    <child id="John"></child> 
    <child id="Heisenberg"></child> 
    <child id="Red"></child> 
    <ul> 
     <li ng-repeat="c in childs"> 
     I'm {{c.scope.nameFunction()}} 
     <button ng-click="fireFunction(c.id,'nameFunction')">Say my name</button> 
     </li> 
    </ul> 
    </div> 
</body> 

控制器

var app = angular.module('app', []); 
app.controller("parentController", function($scope,$rootScope){ 
    $scope.title = "Title"; 
    $scope.childs=[]; 
    $scope.fireFunction = function(id, functionName){ 
    for(i=0; i<$scope.childs.length; i++) 
    { 
     if($scope.childs[i].id===id){ 
      window.alert($scope.childs[i].scope[functionName]()); 
     } 
    } 
    } 
}); 

指令:

app.directive('child', function() { 
    var __controller__ = { 
    restrict: 'E', 
    scope:{ 
     id:"@" 
    }, 
    link: function ($scope, element, attrs) { 
     console.log(attrs.id); 
     $scope.$parent.childs.push({id:attrs.id, scope: $scope}); 
     $scope.nameFunction = function(){ 
     return $scope.id 
     } 
    }, 
    template: '<div>' + 'Hello Dad ! i am is {{id}}' +'</div>' 
    } 
    return __controller__ 
}) 
相關問題