2014-02-21 48 views
0

当我在指令中需要一个控制器时,出现错误,表示无法找到控制器。 请参阅下面的问题的代码。 http://plnkr.co/edit/NzmQPA?p=previewAngularjs指令要求找不到父指令控制器

有人可以看看吗?

谢谢

+1

如果只有控制器有父子关系,则只能使用控制器。看到更新的plunk http://plnkr.co/edit/iLfc3a?p=preview –

+0

@KhanhTO:谢谢你。所以,如果我想要在两个兄弟姐妹指令之间进行沟通,我该怎么做? – jintoppy

回答

1

您应该使用服务在它们之间进行通信。具体如何/你做什么取决于你的确切需求(你的文章中没有足够的信息)。

附注:我将您的点击处理程序更改为ng-click。

下面是一个例子: http://plnkr.co/edit/I2TvvV?p=preview

<div search-result-filter></div> 
<div search-result-header ng-click="doClick()"></div> 

angular.module('mymodule', []) 
    .controller('mainCtrl', ['$scope', 
    function($scope) { 
     $scope.test = "main angular is working"; 
    } 
    ]).controller('searchResultFilterController', ['$scope', 'myService', 
    function($scope, myService) { 
     //do something with 'myService' 
    } 
    ]) 
    .directive('searchResultFilter', [ 
    function() { 
     return { 
     replace: true, 
     controller: 'searchResultFilterController', 
     template: '<h1>this is the first directive</h1>' 
     }; 
    } 
    ]) 
    .directive('searchResultHeader', ['myService', 
    function(myService) { 
     return { 
     replace: true, 
     template: '<button>clickme</button>', 
     link: function($scope, $elem, $attrs) { 
      $scope.doClick = function() { 
      myService.someFn(); 
      }; 
     } 
     }; 
    } 
    ]) 
    .service('myService', function() { 
     this.someFn = function() { 
     alert('this is working'); 
     }; 
    }); 
+0

感谢您的回答。当我们这样使用时,我们只是把服务当作中间人使用的权利?我想要在这些指令之间进行双向通信。因此,如果在指令1上单击一个按钮,则在指令2上会发生一些操作,反之亦然。所以,如果我们使用的是服务,我们该怎么做? – jintoppy

+0

刚刚看到您的评论。再一次,这取决于你在做什么。假设您希望指令1(D1)对指令2(D2)拾取的某个值进行更改。举一个例子,让D1在服务上调用一个函数来改变某个值,而D2在其中一个服务的属性上设置$ watch。看看这篇关于使用3款$ watch的博客文章。 http://www.bennadel.com/blog/2566-Scope-watch-vs-watchCollection-In-AngularJS.htm您可以使用相同的方法让D2在服务上更改值时调用函数。 –

+0

这是一个使用数组的示例更新的plunker。 http://plnkr.co/edit/I2TvvV –

1

你应该使用require当你的指令是相关:像手风琴和手风琴项目。

要在范围之间进行通信,您应该尝试$ on,$ emit,$ broadcast。在你的情况,你需要从rootScope注入rootScope到你的指令,以及广播事件:

.directive('searchResultHeader', 

    function($rootScope) { //inject rootScope 
     return { 
     replace: true, 
     template: '<button>clickme</button>', 
     link: function($scope, $elem, $attrs) { 
      $elem.on('click', function() { 
      $rootScope.$broadcast("someEvent"); //broadcast an event to all child scopes. 
      }); 
     } 
     }; 
    } 
); 

任何范围有兴趣的事件可以订阅它使用$到:

function($scope) { 
     $scope.$on("someEvent", function() { 
      alert('this is working'); 
     }); 
    } 

使用事件是创建解耦系统的一种方法。

DEMO

+1

是的。我们可以这样使用。但是,这是一个好方法吗?我认为,角度不是建议使用广播或发射太多,对吧? – jintoppy

+0

@jintoppy:这个问题有两种解决方案:使用事件和使用服务。要使用哪个取决于我们的应用程序。当另一个范围修改这些“共享”属性时,我们在范围=>之间有一些“共享”属性时使用服务,其他范围都注意到这些更改。在其他情况下,我们使用事件。我不认为角度不是建议使用广播或发射太多,它应该取决于上下文。 –

+0

@jintoppy:如果你的指令没有任何东西要共享。我会使用事件来创建更多的解耦系统。 –