获取angularjs中使用的当前控制器

时间:2017-05-24 09:05:56

标签: javascript angularjs logging ngroute

我想在Angularjs应用程序中记录不同功能的用法。 当前使用的功能通常由浏览器中的当前路由/网址标识,但有些功能在模态/弹出窗口中打开,或者使用ngInclude打开而不更改路由/网址。

是否有任何集中方式来识别当前正在使用的功能,我想到使用当前的顶级控制器,但遗憾的是不知道如何获取它。

为此目的还有其他想法吗?

P.S。我正在使用ngRoute。

3 个答案:

答案 0 :(得分:1)

我看到几种从控制器登录信息的方法。

1)使用element.controller()

来自element.controller()的文档:

  

controller(name) - 检索当前元素或其父元素的控制器。默认情况下检索与之关联的控制器   ngController指令。如果name以camelCase的形式提供   指令名称,然后是该指令的控制器   检索(例如'ngModel')。

你可以在非常元素上使用此函数来获取其父控制器。以下是使用指令的代码段示例:

var app = angular.module('app', [])
app.controller('MainController', function MainController() {});
app.controller('directiveCtrl', function directiveCtrl() {});

app.directive('controllerName', function($timeout) {
    return {
      restrict: 'A',
      template: '<div>My controller name is: {{cName}}</div>',
      controller: 'directiveCtrl',
      link: function($scope, elem, attrs) {
        var name;
        name = elem.controller().constructor.name;
        $scope.cName = name;
      }
    };
  });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js">
</script>
<div ng-app="app">
  <div ng-controller="MainController">
    <div controller-name></div>
  </div>
  ***************************************************
  <div ng-controller="MainController">
    <div ng-controller="directiveCtrl">
      <div controller-name></div>
    </div>
  </div>
  <hr/>
</div>

2)使用控制台

您可以从Web控制台访问每个Angular对象。例如,键入angular.element($0).scope()将获得当前范围。

请参阅this answer,其中非常完整地介绍了控制台的使用。

3)从控制器

进行记录

您可以在代码的开头在控制器中添加控制台调用,并记录您想要的任何内容。这样,每次控制器实例化时都会知道:

app.controller('MyCtrl', function($scope) {
    $scope.greetings = 'Hello world';
    console.log('MyCtrl instanciated!', $scope.greetings);
});

答案 1 :(得分:1)

这是一种记录实例化控制器的有趣且有趣的方法

angular.module('yourModule')
.decorator('$controller', ['$delegate', function controllerDecorator($delegate) {
    return function loggingController (expression, locals, later, ident) {

        // Do all your logging here
        if (typeof (expression) === 'function') {
            console.log('Controller:' + expression.name);

        } else if (locals.$$controller) {
            console.log('Controller: ' + locals.$$controller);

        } else if (expression instanceof Array) {
            console.log('Controller:' + expression[expression.length - 1].name);

        } else {
            console.log('Controller:' + expression);
        }

        // fire regular controller function
        return $delegate(expression, locals, later, ident);
    };
}]);

您在这里所做的几乎是扩展角度控制器功能,因此您可以在所有控制器上获得某些功能,而不仅仅是您的

答案 2 :(得分:-1)

另一种方法是注入$route服务并调用:

$route.current.controller