2016-12-07 35 views
0

我的HTML看起來像這樣:如何在角度1.x中調用兩次嵌套方法?

控制器HTML:

<div ng-controller="Ctrl"> 
<first-directive></first-directive> 
</div> 

第一指令HTML

<li> 
<second-directive></second-directive> 
</li> 

控制器JS

app.controller('Ctrl', (#scope) => { 
$scope.foo = function() { 
    console.log('do smthn'); 
} 
}); 

第一指令:

app.directive('first-directive', function(){ 
return { 
    restrict: 'E', 
    templateUrl: '/partials/first-directive.html', 
    replace: true, 
    scope: { 
    // some data 
    } 
    controllerAs: function(){} 
} 
} 

第二指令:

app.directive('second-directive', function(){ 
return { 
    restrict: 'E', 
    templateUrl: '/partials/second-directive.html', 
    controllerAs: function(){} 
} 
} 

所以我有嵌套的指令控制器和有另一個嵌套指令。當我試圖從第一個指令調用$ parent.foo()時,它可以工作。當我試圖從第二指令調用$ parent。$ parent.foo()時,它不起作用。我也嘗試使用第二指令語法中的ng-controller="Ctrl as ctrl"ctrl.foo(),但它也不起作用。爲什麼?

回答

0

有你的第二個指令前NG-如果添加第二個指令內

<div ng-controller="Ctrl"> 

您使用的?因爲ng-if也會創建自己的作用域

+0

我沒有在ng-controller中添加第二個指令。我添加second-directive的唯一地方是在first-directive中。我不使用ng,如果有的話。 –

+0

你可以嘗試從第二個指令$ parent.foo(),因爲它沒有隔離範圍。 –

+0

我不認爲這是兩層嵌套 –

0

您可以在嵌套的指令控制器中使用$rootScope.$broadcast,然後在父控制器上使用$rootScope.$on

在第二個指令

app.directive('second-directive', function(){ 
    return { 
     restrict: 'E', 
     templateUrl: '/partials/second-directive.html', 
     controller: function($rootScope){ 
     $rootScope.$broadcast('parentCtrl',{}); 
       } 
     } 
    } 

在父控制器

app.controller('Ctrl', ($scope,$rootScope) => { 
$scope.foo = function() { 
     console.log('do smthn'); 
    } 
    $rootScope.$on('parentCtrl', function (event, data){ 
    //do the parent task here 
    } 
}); 

您也可以使用服務功能的子控制器和父控制器之間的通信。

0

由於第二個嵌套指令沒有隔離範圍,請嘗試$ parent.foo()