it-swarm.com.de

Bekomme den Controller-Namen aus $ scope

Gibt es eine Möglichkeit, den Controller-Namen aus dem aktuellen $ scope in AngularJS abzurufen?

34
tommaso capelli

Nein, das ist nicht möglich. Was ist, wenn $scope zur Direktive gehört? Es gibt keine Eigenschaft, die Informationen über den Controller abrufen kann, zu dem der Bereich gehört.

7
Engineer

Ich bin nicht sicher, ob dies eine gute Lösung ist, aber ich konnte $scope.controllerName mit dieser Technik injizieren:

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

Dann

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

Basierend auf der Antwort von Kevin Hakanson und dem Kommentar von Darkthread funktioniert dieser Code also mit mindestens 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);
        };
    }])
}]);
11
Thomas Kekeisen

Das funktioniert auch bei mir. Ich brauchte eine Funktion, um zu ermitteln, ob der Controller-Name mit einer bestimmten Route übereinstimmt, wenn Sie mit ngRoute einen Controller auswählen.

app.controller('navigation', function($scope, $route) {
  $scope.tab = function(route) {
    return $route.current && route === $route.current.controller;
  }
}

Dann kann ich es so verwenden:

<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>

Wo ich meiner Konfiguration bereits Routen hinzugefügt habe, z. so etwas wie

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

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

    })
8
Dave Syer

Probieren Sie in der Controller-Factory-Funktion einfach$ attrsservice aus

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

      var currentControllerName = $attrs["ngController"];

}]);
5
Kevin Dai

Die Frage wird etwas alt, aber für einige von Ihnen könnte es dennoch hilfreich sein ... Ich habe einen Weg gefunden, den Controller-Namen zu bekommen aber Es funktioniert nur mit einer Controller as-Syntax. Ich kann meine Protokollierung jetzt einfacher durchführen, ohne den Controller-Namen jedes Mal manuell neu schreiben zu müssen. Hier ist ein Beispiel:

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

Wenn Sie es vom DOM aus (aus älterem Javascript-Code) machen möchten, können Sie dies auch folgendermaßen tun:

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


Bearbeiten
Auch den Vorschlag von Dave Syer ausprobiert es funktioniert eigentlich auf $scope wie zum Beispiel:

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

nur this.constructor.name überall dort, wo der Gültigkeitsbereich dieser Klasse einmal instanziiert ist.

2
IzzakActive

Wenn Sie von der Konsole aus debuggen, war dies für mich hilfreich:

  1. Wählen Sie in der Benutzeroberfläche das Element aus, dessen Controller Sie in den Chrome-Entwicklungswerkzeugen suchen
  2. Eingabe in der Konsole: angular.element($0).controller().__proto__

Sie erhalten den Prototyp des Controllers, innerhalb seines Konstruktors gibt es FunctionLocation, das einer Datei entspricht. Wenn Sie Ihre Controller so erstellen, wie Sie sollten, haben Sie Ihren Controller dort gefunden. Es ist noch besser, wenn Sie Ihre Dateien als Controller benennen. Ich verstehe nicht, warum Sie dies nicht tun würden.

Ich weiß, es ist nicht genau das, wonach Sie gefragt haben, aber ich finde es hilfreich und extrem einfach, es direkt von den Entwicklertools zu verwenden.

0
DanteTheSmith

Es ist möglich, den Geltungsbereich der Anweisung sowie den Umfang des Controllers mit jQuery abzurufen.

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

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

Wir können eine Methode ausführen oder jede Variable von überall aus mit diesen Abrufmethoden aktualisieren.

Zum Beispiel: Betrachten wir eine Methode vom mainCtrl-Controller. Wir brauchen nur einen direkten Aufruf an method wie folgt:

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