我有一系列控制器:
Controller1
Controller2
Controller3
我也有一个服务,我的所有控制器都会调用。目前,在每个Controller的顶部,我创建了一个声明Controller名称的范围:
$scope.ControllerName = 'Page1Controller';
然后我将此范围传递给服务:
$scope.$parent.Description = serviceMydata.getDescription($scope.ControllerName).toString();
有没有办法不必申报$scope.ControllerName
?
我的服务:
app.service('serviceMydata', function(){
return {
getDescription: function(ControllerName) {
return [
mapData[ControllerName]
];
}
}
});
var mapData = {
Page1Controller : 'Data to insert when on Page1',
Page2Controller : 'Data to insert when on Page2',
Page3Controller : 'Data to insert when on Page3',
Page4Controller : 'Data to insert when on Page4',
}
答案 0 :(得分:1)
当您声明控制器时,您可以执行以下操作:
(function(){
var ctrlName = 'MainCtrl'
app.controller(ctrlName, function($scope, service) {
myService.fn(ctrlName);
});
})();
Afaik,没有一种简单的方法可以通过棱角分明,我没有理由去尝试。
答案 1 :(得分:1)
您可以在服务中的闭包内捕获控制器的名称:
var app = angular.module('myapp', []);
app.service('myservicefactory', function () {
return {
create: function (name) {
var controllerName = name;
return {
getDescription: function () {
console.log(controllerName);
}
};
}
};
});
app.controller('myctrl', ['$scope', 'myservicefactory', function ($scope, myservicefactory) {
$scope.service = myservicefactory.create('myctrl');
$scope.callService = function () {
$scope.service.getDescription();
};
}]);
app.controller('myctrl2', ['$scope', 'myservicefactory', function ($scope, myservicefactory) {
$scope.service = myservicefactory.create('myctrl2');
$scope.callService = function () {
$scope.service.getDescription();
};
}]);
是的,您必须实例化您的服务并提供控制器名称或其他内容,但之后,它会在您的服务中捕获。这是一个小提琴演示:http://jsfiddle.net/29wtqeyz/1/。
我认为你不想要更紧密耦合的东西:请记住,你的服务不应该与消费者联系。