当我在指令中需要一个控制器时,出现错误,表示无法找到控制器。 请参阅下面的问题的代码。 http://plnkr.co/edit/NzmQPA?p=previewAngularjs指令要求找不到父指令控制器
有人可以看看吗?
谢谢
当我在指令中需要一个控制器时,出现错误,表示无法找到控制器。 请参阅下面的问题的代码。 http://plnkr.co/edit/NzmQPA?p=previewAngularjs指令要求找不到父指令控制器
有人可以看看吗?
谢谢
您应该使用服务在它们之间进行通信。具体如何/你做什么取决于你的确切需求(你的文章中没有足够的信息)。
附注:我将您的点击处理程序更改为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');
};
});
感谢您的回答。当我们这样使用时,我们只是把服务当作中间人使用的权利?我想要在这些指令之间进行双向通信。因此,如果在指令1上单击一个按钮,则在指令2上会发生一些操作,反之亦然。所以,如果我们使用的是服务,我们该怎么做? – jintoppy
刚刚看到您的评论。再一次,这取决于你在做什么。假设您希望指令1(D1)对指令2(D2)拾取的某个值进行更改。举一个例子,让D1在服务上调用一个函数来改变某个值,而D2在其中一个服务的属性上设置$ watch。看看这篇关于使用3款$ watch的博客文章。 http://www.bennadel.com/blog/2566-Scope-watch-vs-watchCollection-In-AngularJS.htm您可以使用相同的方法让D2在服务上更改值时调用函数。 –
这是一个使用数组的示例更新的plunker。 http://plnkr.co/edit/I2TvvV –
你应该使用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');
});
}
使用事件是创建解耦系统的一种方法。
是的。我们可以这样使用。但是,这是一个好方法吗?我认为,角度不是建议使用广播或发射太多,对吧? – jintoppy
@jintoppy:这个问题有两种解决方案:使用事件和使用服务。要使用哪个取决于我们的应用程序。当另一个范围修改这些“共享”属性时,我们在范围=>之间有一些“共享”属性时使用服务,其他范围都注意到这些更改。在其他情况下,我们使用事件。我不认为角度不是建议使用广播或发射太多,它应该取决于上下文。 –
@jintoppy:如果你的指令没有任何东西要共享。我会使用事件来创建更多的解耦系统。 –
如果只有控制器有父子关系,则只能使用控制器。看到更新的plunk http://plnkr.co/edit/iLfc3a?p=preview –
@KhanhTO:谢谢你。所以,如果我想要在两个兄弟姐妹指令之间进行沟通,我该怎么做? – jintoppy