2014-04-30 4 views
31

AngularJS의 현재 $ 범위에서 컨트롤러 이름을 가져 오는 방법이 있습니까?

+0

무엇을하려고합니까? 그것을 알고 싶다면 컨트롤러가'$ scope.controllerName'에 이름을 붙이게 할 수 있습니다. –

+0

맞아요.하지만 나와 함께 협력하는 모든 사람들이 컨트롤러의 이름을 $ scope 변수에 넣어야한다는 것을 기억해야하기 때문에 유용하지 않습니다. –

답변

5

아니요, 불가능합니다. $scope이 지침에 속하면 어떻게 될까요? 범위가 속한 컨트롤러에 대한 정보를 검색 할 수있는 속성은 없습니다.

+0

귀하의 질문은 제가 생각한 첫 번째 문제였습니다. 그래서 angularJs의 핵심 권리를 해킹하지 않고는 그렇게 할 수 없습니다. –

+1

@tommasocapelli 방법이 없습니다. 이름을 수동으로 속성으로 지정해야합니다. – Engineer

+0

감사합니다. $ scope에서 컨트롤러 이름을 얻는 다른 방법을 찾지 못했다면 저의 솔루션이었을 것입니다. –

27

나는이 좋은 해결책이 있는지 모르겠지만,이 기술을 사용 $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"); 
}]); 
+11

공유해 주셔서 감사합니다. 이 코드는 1.2.x에서 잘 작동하지만 1.3에서는 깨졌습니다. 데모 : http://jsbin.com/muqipe/3/edit?html,console,output 소스 코드를 추적 한 후, 1.3에 대해 두 가지 더 많은 인수가 없어서 "함수 (생성자, 지역, 나중에, 들여 쓰기) "및"$ 대리자 (생성자, 지역, 나중에 들여 쓰기) "를 참조하십시오. – Darkthread

+0

Darkthread 당신은 구세주이며, 초기 응답을 제공하기 위해 동일한 것을 주장하고 있습니다 :) –

+0

디버깅 목적으로 놀라운 트릭 – ganqqwerty

8

이 또한 나를 위해 작동합니다.

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> 
컨트롤러를 선택하기 위해 'ngRoute'를 사용할 때 컨트롤러 이름이 주어진 경로를 일치하면 내가 결정하는 함수를 필요, 그래서 이런 짓을

이미 내 설정에 경로를 추가했습니다.

angular.module('app', [ 'ngRoute' ]).config(
    function($routeProvider) { 

     $routeProvider.otherwise('/'); 
     $routeProvider.when('/', { 
      templateUrl : 'home.html', 
      controller : 'home' 
     }).when('/dashboard', { 
      templateUrl : 'dashboard.html', 
      controller : 'dashboard' 
     }); 

    }) 
2

문제 같은 것이 조금 오래된지고 있지만, 여전히 일부 도움이 될 수있는 ... 나는 컨트롤러 이름 하지만 단지 Controller as 구문 작동을 얻을 수있는 방법을 발견했다. 이제 컨트롤러 이름을 매번 수동으로 다시 쓰지 않아도 로깅을 더 쉽게 할 수 있습니다.

// 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); 


편집
는 또한 시도
:

// 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에서 작업을 수행하려는 경우, 당신은 이런 식으로 할도 수 예를 들면 다음과 같습니다 실제로 예를 들어 같은 $scope에서 작동이 Dave Syer의 제안 :

app.controller("ContactController", ['$route', function ContactController($route) { 
    console.log($route.current.controller); 
}]); 
+1

이것은 훌륭합니다! 커다란 프로젝트에서 일하고 있는데, 페이지에서 주어진 엘리먼트를 클릭하고 'angular.element ($ 0) .controller(). constructor.name'을 실행하여 컨트롤러를 찾아야하는 것이 훨씬 쉽습니다. 콘솔에. –

11

그래서, 기초 오 N 케빈 Hakanson에서 대답하고 Darkthread에서 주석이,이 코드는 적어도 1.3.15에서 작동합니다 단지 $ attrs에 서비스를 시도 컨트롤러 공장 함수에서

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); 
     }; 
    }]) 
}]); 
+0

앱을 축소하면이 기능이 작동하지 않습니다. 축소 된 파일에서도 인수의 이름을 어떻게 확인할 수 있습니까? –

+0

제 경우에는 꿀꺽 꿀꺽 마술을 사용하여 응용 프로그램을 배포합니다. 그래서 나는이 문제를 다음과 같이 해결할 수 있었다 : https://www.npmjs.com/package/gulp-ng-annotate –

+1

은 축소를 허용하는 편집을 제출했다. – coder

5

dev에

app.controller("MyController", ["$attrs", function($attrs){ 

     var currentControllerName = $attrs["ngController"]; 

}]); 
2

this.constructor.name 어디서나 해당 클래스의 범위를 사용할 수 있습니다.

관련 문제