[英]call function from another controller in a button onClick
我试图单击一个按钮并触发另一个控制器的功能。 这里重要的部分是我有两个控制器DashboardController,其中有一个带按钮的数据表和一个onClick,我调用了另一个名为DashboardDeviceController的控制器的函数。
我这样做是为了当我单击按钮时,我将打开一个带有标签的新视图,其中每个标签都会有图形。
因此,我想在单击按钮时指定将打开的选项卡,而不是默认情况下为活动选项卡的“消费”。
DasboardController
datatableoptions中的按钮
return icon = '<center><a class="state-link" data-state-id="' + data.id + '" ng-click="setActiveTab(\"consumptions\")"><i style="color:#ff0000; width:21px; height:21px" title="Consumptions threshold exceed" class="fa fa-warning"></i></a></center>';
我尝试这样做,但是没有用..
$rootScope.$on("setActiveTab", function(name, obj, event){
$scope.parentmethod(name, obj);
});
$scope.parentmethod = function(name, obj, event) {
// task
console.log("name ",name);
var btn = event.currentTarget;
obj[btn.id]=true;
console.log("btn ", btn);
activeTab = name;
}
DashboardDeviceController
controllerScope.activeTab = {
consumptions: true,
network : false,
ap : false,
modem : false,
system : false,
};
controllerScope.getActiveTab = function () {
console.log("getActiveTab()");
var activeTab = null;
for(var tabName in controllerScope.activeTab) {
if (controllerScope.activeTab[tabName]) {
activeTab = tabName;
break;
}
}
return activeTab;
}
controllerScope.setActiveTab = function (name) {
console.log("setActiveTab()");
var activeTab = null;
for(var tabName in controllerScope.activeTab) {
if (controllerScope.activeTab[tabName] == name) {
controllerScope.activeTab = name;
break;
}
}
}
在angularjs中,要具有可重用的功能或事物,您必须创建一个服务。
angular.module('myModule')
.factory('myService', serviceFunction);
serviceFunction.$inject = [];
function serviceFunction() {
return {
reusableFunction1: function() {}
};
}
在angularjs服务(或工厂)中,实现应用程序的业务逻辑。 例如,您可以使用服务来管理身份验证。 创建服务后,可以将其注入控制器以使用其功能:
angular.module('myModule')
.controller('myCtrl', myCtrl);
myCtrl.$inject = ['$scope', 'myService'];
function myCtrl($scope, myService) {
myService.reusableFunction1();
}
如果您想了解更多信息,我会加入服务和工厂官方文档的链接:
使用BROADCAST/EMIT an ON
进行通信
$scope.$emit('myCustomEvent', 'Data to send');
// firing an event downwards
$scope.$broadcast('myCustomEvent', {
someProp: 'Sending you an Object!' // send whatever you want
});
// listen for the event in the relevant $scope
$scope.$on('myCustomEvent', function (event, data) {
console.log(data); // 'Data to send'
});
例
plunkr: https ://plnkr.co/edit/WemGxPytLLmPulml8xjK ? p = preview
要么
您可以使用angular.extend在控制器之间进行通讯/链接
app.controller('DashboardController', function($scope, $controller) {
angular.extend(this, $controller('DashboardDeviceController', {$scope: $scope}));
});
控制器之间的通信通过$ emit + $ on / $ broadcast + $ on方法完成。
return icon = '<center><a class="state-link" data-state-id="' + data.id + '" ng-click="setActiveTab($event)"><i style="color:#ff0000; width:21px; height:21px" title="Consumptions threshold exceed" class="fa fa-warning"></i></a></center>';
在DashboardController
的setActiveTab($event)
动作中,您需要调用DashboardDeviceController
函数,如下所示
假设您有
app.controller('DashboardDeviceController', ['$scope', '$rootScope'
function($scope) {
$rootScope.$on("CallParentMethod", function(){
$scope.parentmethod();
});
$scope.parentmethod = function() {
// task
}
}
]);
app.controller('DashboardController', ['$scope', '$rootScope'
function($scope) {
$scope.setActiveTab = function(event) {
$rootScope.$emit("CallParentMethod", {});
}
}
]);
besat的想法是这样的,首先,您需要检查控制器的优先级,例如它们是通信:
1.父母与孩子的沟通
then do in your parent controller $scope.$broadcast('name',{objkey:value});
then do in your child controller $scope.$on('name',function(event,args){
//console the args params
});
2.孩子与父母的沟通:
then do in your child controller $scope.$emit('name',{objkey:value});
then do in your parent controller $scope.$on('name',function(event,args){
//console the args params
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.