我想在Angularjs应用程序中记录不同功能的用法。 当前使用的功能通常由浏览器中的当前路由/网址标识,但有些功能在模态/弹出窗口中打开,或者使用ngInclude打开而不更改路由/网址。
是否有任何集中方式来识别当前正在使用的功能,我想到使用当前的顶级控制器,但遗憾的是不知道如何获取它。
为此目的还有其他想法吗?
P.S。我正在使用ngRoute。
答案 0 :(得分: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>
您可以从Web控制台访问每个Angular对象。例如,键入angular.element($0).scope()
将获得当前范围。
请参阅this answer,其中非常完整地介绍了控制台的使用。
您可以在代码的开头在控制器中添加控制台调用,并记录您想要的任何内容。这样,每次控制器实例化时都会知道:
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