2014-01-23 10 views
39

Ich bin neu zu angularjs, ich weiß, dass $scope eine Verbindung zwischen dem Controller und der Ansicht darstellen, aber gibt es einen Weg neben der Suche nach class="ng-scope", um das Scope-Element zu bekommen, meine ich so etwas:Angularjs: Get-Element in Controller

Ich weiß, dass der gleiche Controller kann mehreren Bereichen zugewiesen werden, So ist es vielleicht nicht möglich.

+0

Was meinen Sie mit dem Scope-Element? Meinst du das Element, auf dem der Controller angemeldet ist? –

+4

Sie sollten niemals auf DOM-Elemente innerhalb des Controllers zugreifen! Dies ist genau die Art von Verhalten, die Angular versucht zu entmutigen !! –

+1

Jede Art von DOM-Interaktion sollte nur über Direktiven erfolgen, niemals in einem Controller. –

Antwort

57

Sie können in dem Element an die Steuerung übergeben, ebenso wie der Umfang:

function someControllerFunc($scope, $element){ 

} 
+0

Sollte ich irgendeine Abhängigkeit in das Modul einschließen ?, weil $ element nicht definiert ist. –

+12

Tatsächlich ist '$ element' nach mehr Nachforschungen kein guter Weg, um auf das Element zuzugreifen, und wird [entzogen] (http://stackoverflow.com/questions/12960701/how-do-i-get-current-) scope-dom-element-in-eckigjs-controller). Wahrscheinlich möchten Sie dafür eine [Anweisung] (http://docs.angularjs.org/guide/directive) verwenden. – apohl

+0

Ja, ich habe vor ein paar Minuten darüber gelesen ... –

7

$element ist eine von vier Einheimischen, dass $compileProvider zu $controllerProvider gibt, die dann zu $injector gegeben wird. Der Injektor injiziert lokal nur dann in Ihre Controller-Funktion, wenn Sie gefragt werden.

Die vier Einheimischen sind:

  • $scope
  • $element
  • $attrs
  • $transclude

Die offizielle Dokumentation: AngularJS $compile Service API Reference - controller

Der Quellcode von Github angular.js/compile.js:

function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope) { 
    var elementControllers = createMap(); 
    for (var controllerKey in controllerDirectives) { 
     var directive = controllerDirectives[controllerKey]; 
     var locals = { 
     $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, 
     $element: $element, 
     $attrs: attrs, 
     $transclude: transcludeFn 
     }; 

     var controller = directive.controller; 
     if (controller == '@') { 
     controller = attrs[directive.name]; 
     } 

     var controllerInstance = $controller(controller, locals, true, directive.controllerAs); 
1

Ich weiß nicht, was meinst du genau, aber hoffen, dass es Ihnen helfen. in HTML

<input scope-element="txtMessage" > 

dann innerhalb Controller
von dieser Richtlinie können Sie die DOM-Element innerhalb Controller zugreifen
dies Probe, die Sie

.directive('scopeElement', function() { 
    return { 
     restrict:"A", // E-Element A-Attribute C-Class M-Comments 
     replace: false, 
     link: function($scope, elem, attrs) { 
      $scope[attrs.scopeElement] = elem[0]; 
     } 
    }; 
}) 

jetzt, innerhalb Element helfen Controller zu konzentrieren:

.controller('messageController', ['$scope', function ($scope) { 
    $scope.txtMessage.focus(); 
}])