有没有办法从AngularJS中的当前$ scope获取控制器名称?
答案 0 :(得分:30)
我不确定这是一个很好的解决方案,但我能够使用这种技术注入$scope.controllerName
:
app.config(['$provide', function ($provide) {
$provide.decorator('$controller', [
'$delegate',
function ($delegate) {
return function(constructor, locals) {
if (typeof constructor == "string") {
locals.$scope.controllerName = constructor;
}
return $delegate.apply(this, [].slice.call(arguments));
}
}]);
}]);
然后
app.controller('SampleCtrl', ['$scope', '$log', function ($scope, $log) {
$log.log("[" + $scope.controllerName +"] got here");
}]);
答案 1 :(得分:11)
所以,根据Kevin Hakanson的回答和Darkthread的评论,这段代码至少可以使用1.3.15:dev
app.config(['$provide', function ($provide) {
$provide.decorator('$controller', ['$delegate', function ($delegate) {
return function (constructor, locals, later, indent) {
if (typeof constructor === 'string' && !locals.$scope.controllerName) {
locals.$scope.controllerName = constructor;
}
return $delegate(constructor, locals, later, indent);
};
}])
}]);
答案 2 :(得分:8)
这对我也有用。当使用'ngRoute'选择控制器时,我需要一个函数来确定控制器名称是否与给定路径匹配,所以我这样做了:
app.controller('navigation', function($scope, $route) {
$scope.tab = function(route) {
return $route.current && route === $route.current.controller;
}
}
然后我可以像这样使用它:
<div ng-controller="navigation" class="container">
<ul class="nav nav-pills" role="tablist">
<li ng-class="{active:tab('home')}"><a href='#/'>home</a></li>
<li ng-class="{active:tab('dashboard')}"><a href='#/dashboard'>dashboard</a></li>
</ul>
</div>
我已经在我的配置中添加了路由,例如
之类的东西angular.module('app', [ 'ngRoute' ]).config(
function($routeProvider) {
$routeProvider.otherwise('/');
$routeProvider.when('/', {
templateUrl : 'home.html',
controller : 'home'
}).when('/dashboard', {
templateUrl : 'dashboard.html',
controller : 'dashboard'
});
})
答案 3 :(得分:7)
不,这是不可能的。如果$scope
属于指令怎么办?没有属性可以检索有关作用域所属控制器的信息。
答案 4 :(得分:5)
在控制器工厂功能中,只需尝试 $ attrs 服务
app.controller("MyController", ["$attrs", function($attrs){
var currentControllerName = $attrs["ngController"];
}]);
答案 5 :(得分:2)
问题是变得有点老了但是对于你们中的一些人来说它可能仍然有用...我找到了获取控制器名称的方法但是它只适用于Controller as
语法。我现在可以更轻松地进行日志记录,而无需每次都手动重新编写控制器名称。这是一个例子:
// a simple route with controller as syntax
$routeProvider.when(
'/contact',
{
templateUrl: 'home/contact',
controller: 'ContactController as vm'
}
);
// controller
app.controller("ContactController", ["$log", function ContactController($log) {
var vm = this;
$log.log(vm.constructor.name);
}]);
如果你想从DOM(来自javascript遗留代码)做到这一点,你也可以这样做:
// scope element via the DOM
var scope = angular.element($(element)).scope();
console.log(scope.this.vm.constructor.name);
// controller element via the DOM
var controller = angular.element($(element)).controller();
console.log(controller.constructor.name);
编辑
还尝试了Dave Syer的建议,它实际上适用于$scope
,例如:
app.controller("ContactController", ['$route', function ContactController($route) {
console.log($route.current.controller);
}]);
答案 6 :(得分:2)
只需this.constructor.name
,只要实例化该类的范围即可。
答案 7 :(得分:0)
使用jQuery可以获取指令范围和控制器范围。
window.top.$('[ng-controller="mainCtrl"]').scope(); // get scope of controller
window.top.$('[epubby-page-view]').scope(); // get scope of directive
使用此范围获取方法,我们可以在任何地方执行方法或更新任何变量。
例如: 考虑我们要从mainCtrl控制器执行一个方法, 我们只需要直接调用方法,如下所示:
var myData = window.top.$('[ng-controller="mainCtrl"]').scope().getData();
答案 8 :(得分:0)
如果您要从控制台进行调试,那么我发现这很有用:
angular.element($0).controller().__proto__
它将为您提供控制器的原型,在其构造函数内部,有FunctionLocation
对应于一个文件。如果像每个文件一样使一个控制器一个,则可以在其中找到控制器。如果将文件命名为控制器会更好,但我不知道为什么不这样做。
我知道这并不是您真正要求的,但是我发现它对开发人员工具很有帮助,并且非常易于使用。