programing

$scope에서 컨트롤러 이름 가져오기

powerit 2023. 3. 14. 21:58
반응형

$scope에서 컨트롤러 이름 가져오기

AngularJS의 현재 $scope에서 컨트롤러 이름을 얻을 수 있는 방법이 있습니까?

이게 좋은 해결책인지는 잘 모르겠지만, 전 이 문제를 해결할 수 있었습니다.$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.apply(this, [].slice.call(arguments));
            }
        }]);
}]);

그리고나서

app.controller('SampleCtrl', ['$scope', '$log', function ($scope, $log) {
    $log.log("[" + $scope.controllerName +"] got here");
}]);

따라서 Kevin Hakanson의 답변과 Darkthread의 코멘트를 바탕으로 이 코드는 적어도 1.3.15:dev에서 작동합니다.

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

아니, 그건 불가능해.면 어쩌지$scope지시사항에 속합니까?범위가 속한 컨트롤러에 대한 정보를 검색할 수 있는 속성이 없습니다.

이것도 좋아요.'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'
        });

    })

컨트롤러 팩토리 기능에서는 $attrs 서비스를 사용해 보십시오.

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

      var currentControllerName = $attrs["ngController"];

}]);

그저.this.constructor.name해당 클래스의 범위가 인스턴스화되면 사용할 수 있는 모든 위치.

질문이 좀 낡았지만 그래도 도움이 될 수 있을 것 같은데...컨트롤러 이름을 얻는 방법을 찾았는데, 이 기능은 다음 명령어에서만 작동합니다.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); 
}]);

(javascript 레거시 코드에서) DOM에서 이 작업을 수행할 경우 다음과 같이 수행할 수도 있습니다.

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

jQuery를 사용하면 지시 범위와 컨트롤러 범위를 얻을 수 있습니다.

 window.top.$('[ng-controller="mainCtrl"]').scope(); // get scope of controller

 window.top.$('[epubby-page-view]').scope(); // get scope of directive

이 스코프 가져오기 방법을 사용하여 어디서든 메서드를 실행하거나 변수를 업데이트할 수 있습니다.

예를 들어 mainCtrl 컨트롤러에서 메서드를 실행하는 경우 다음과 같이 메서드를 직접 호출하면 됩니다.

var myData = window.top.$('[ng-controller="mainCtrl"]').scope().getData();

콘솔에서 디버깅하는 경우 도움이 되는 것은 다음과 같습니다.

  1. Chrome 개발 도구에서 검색할 컨트롤러를 UI에서 선택하십시오.
  2. 콘솔 입력:angular.element($0).controller().__proto__

컨트롤러의 프로토타입을 얻을 수 있습니다.컨스트럭터 내부에는FunctionLocation파일에 대응합니다.필요에 따라서, 파일 마다 1 개씩 컨트롤러를 작성하면, 컨트롤러가 거기에 있는 것을 알 수중에 있습니다.파일 이름을 컨트롤러로 지정하면 더 좋습니다. 왜 그렇게 하지 않는지 모르겠네요.

요청하신 내용은 아니지만 개발 도구에서 바로 사용할 수 있어 편리합니다.

언급URL : https://stackoverflow.com/questions/23382734/get-controller-name-from-scope

반응형