Есть ли способ получить имя контроллера из текущей $scope в AngularJS?
Получить имя контроллера из $scope
Ответ 1
Нет, это невозможно. Что делать, если $scope
принадлежит директиве? Нет свойства, которое может получить информацию о контроллере, к которому принадлежит область.
Ответ 2
Я не уверен, что это хорошее решение, но я смог ввести $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(constructor, locals);
}
}]);
}]);
Тогда
app.controller('SampleCtrl', ['$scope', '$log', function ($scope, $log) {
$log.log("[" + $scope.controllerName +"] got here");
}]);
Ответ 3
Итак, исходя из ответа Кевина Хакансона и комментария от Darkthread, этот код работает как минимум с 1.3.15:
app.config(function($provide) {
$provide.decorator('$controller', 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);
};
});
});
Ответ 4
Это также работает для меня. Мне нужна была функция, чтобы определить, соответствует ли имя контроллера заданному маршруту при использовании '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'
});
})
Ответ 5
В функции контроллера factory просто попробуйте $attrs сервис
app.controller("MyController", ["$attrs", function($attrs){
var currentControllerName = $attrs["ngController"];
}]);
Ответ 6
Вопрос становится немного старым, но может быть полезным для некоторых из вас... Я нашел способ получить имя контроллера , но он работает только с синтаксисом 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);
}]);
Ответ 7
just this.constructor.name
где угодно, когда область действия этого класса доступна после создания экземпляра.