2016-12-07 55 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()