我来找你,因为我不知道如何访问两个不同的控制器到全局功能。
我尝试访问应该被称为两个不同控制器的泛型函数。断开连接功能允许您断开与应用程序的连接,但也可以重置全局变量。
controller_1和controller_2:
function CONTROLLER_1 ($scope, $rootScope) {
$scope.disconnect = function() {
// RESET $rootScope variable
$rootScope.var1 = 0;
$rootScope.var2 = 0;
etc...
};
}
function CONTROLLER_2 ($scope, $rootScope) {
$scope.disconnect = function() {
// RESET $rootScope variable
$rootScope.var1 = 0;
$rootScope.var2 = 0;
etc...
};
}
我想要这样的事情:
function CONTROLLER_1 ($scope, $rootScope) {
$scope.disconnect = function() {
//CALL GLOBAL_METHOD
}
}
function CONTROLLER_2 ($scope, $rootScope) {
$scope.disconnect = function() {
//CALL GLOBAL_METHOD
}
}
My GLOBAL_METHOD {
// RESET $rootScope variable
$rootScope.var1 = 0;
$rootScope.var2 = 0;
etc...
}
在这种情况下是否有可能有类似的解决方案? 如果我不够精确,请不要犹豫,向我询问更多信息
感谢您的帮助。
答案 0 :(得分:4)
您似乎应该使用服务:
我可以看到两种解决方案:
1°)由于每个控制器都继承自rootScope,您可以在rootScope上定义断开功能,您可以自动调用断开连接:
angular.module('app').run(['$rootScope', function($rootScope) {
$rootScope.disconnect = function() {
$rootScope.var1 = 0;
$rootScope.var2 = 0;
};
}]);
angular.controller('Ctrl1', ['$scope', '$rootScope', function($scope, $rootScope) {
// Disconnect function is already define
$scope.applyDisconnect = function() {
$scope.disconnect(); // Or $rootScope.disconnect();
};
}]);
angular.controller('Ctrl2', ['$scope', '$rootScope', function($scope, $rootScope) {
// Disconnect function is already define
}]);
注意,不应重新定义断开连接功能。
看到这个小提琴:http://jsfiddle.net/37cMw/2
2°)使用专用服务并将其注入控制器:
angular.module('myApp').service('DisconnectService', ['$rootScope' function($scope) {
this.disconnect = function() {
$rootScope.var1 = 0;
$rootScope.var2 = 0;
};
}]);
angular.module('myApp').controller('Ctrl1', ['$scope', 'DisconnectService', function($scope, service) {
$scope.disconnect = function() {
service.disconnect();
};
}]);
angular.module('myApp').controller('Ctrl2', ['$scope', 'DisconnectService', function($scope, service) {
$scope.disconnect = function() {
service.disconnect();
};
}]);
看到这个小提琴:http://jsfiddle.net/QFvyj/
第二个解决方案是我最喜欢的,因为你没有污染rootScope命名空间。
答案 1 :(得分:1)
是的,你可以!将方法添加到模块的.run
angular.module('app').run(function($rootScope) {
$rootScope.GLOBAL_METHOD = function() {
//YOUR STUFF
})
})
您可以从每个控制器调用此方法,如下所示:
$rootScope.GLOBAL_METHOD();
所以在你的情况下:
function CONTROLLER_1 ($scope, $rootScope) {
$scope.disconnect = function() {
$rootScope.GLOBAL_METHOD();
}
}
function CONTROLLER_2 ($scope, $rootScope) {
$scope.disconnect = function() {
$rootScope.GLOBAL_METHOD();
}
}
答案 2 :(得分:0)
虽然user2874153提供的解决方案可能有效,但最好避免污染$rootScope
。要在控制器之间共享功能,您应该创建一个服务。
您还应该避免在全局命名空间中声明控制器,而应该使用angular.module
语法(请参阅http://docs.angularjs.org/guide/controller#setting-up-the-initial-state-of-a-object,其中的部分显示为“注意:”)
angular.module('myApp', []);
angular.module('myApp')
.controller('OneCtrl', function ($scope, SharedService) {
SharedService.doSomething();
});
angular.module('myApp')
.controller('TwoCtrl', function ($scope, SharedService) {
SharedService.doSomething();
});
angular.module('myApp')
.service('SharedService', function () {
return {
doSomething: function () {
// do something here.
}
};
});