Подтвердить что ты не робот

Получить имя контроллера из $scope

Есть ли способ получить имя контроллера из текущей $scope в AngularJS?

4b9b3361

Ответ 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 где угодно, когда область действия этого класса доступна после создания экземпляра.