从$ scope获取控制器名称

时间:2014-04-30 08:03:40

标签: angularjs angularjs-scope

有没有办法从AngularJS中的当前$ scope获取控制器名称?

9 个答案:

答案 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)

如果您要从控制台进行调试,那么我发现这很有用:

  1. 在用户界面中选择要在Chrome开发者工具中搜索其控制器的元素
  2. 在控制台中输入:angular.element($0).controller().__proto__

它将为您提供控制器的原型,在其构造函数内部,有FunctionLocation对应于一个文件。如果像每个文件一样使一个控制器一个,则可以在其中找到控制器。如果将文件命名为控制器会更好,但我不知道为什么不这样做。

我知道这并不是您真正要求的,但是我发现它对开发人员工具很有帮助,并且非常易于使用。