2014-01-23 2 views
39

Я новичок в angularjs, я знаю, что $scope представляет собой соединение между контроллером и представлением. Но есть ли способ помимо поиска class="ng-scope", чтобы получить элемент scope, я имею в виду что-то вроде этого:Angularjs: Получить элемент в контроллере

function someControllerFunc($scope){ 
     $scope.element; 
} 

Я знаю, что тот же контроллер может быть назначен для нескольких областей, поэтому, возможно, это невозможно.

+0

Что вы понимаете, получив элемент сферы? Вы имеете в виду элемент, объявленный контроллером? –

+4

Вы не должны получать доступ к каким-либо элементам DOM из контроллера! Это именно тот тип поведения, который Angular пытается отговорить !! –

+1

Любое взаимодействие с DOM должно выполняться только с помощью директив, никогда в контроллере. –

ответ

57

Вы можете передать в элементе к контроллеру, так же как и объем:

function someControllerFunc($scope, $element){ 

} 
+0

Должен ли я включать любую зависимость в модуль ?, Поскольку $ element не определен. –

+12

На самом деле, после дополнительных исследований '$ element' не является хорошим способом доступа к элементу, и он [лишен] (http://stackoverflow.com/questions/12960701/how-do-i-get-current- сфера-дом-элемент-в-angularjs-контроллер). Вероятно, вы захотите использовать для этого [директиву] (http://docs.angularjs.org/guide/directive). – apohl

+0

Да, я начал читать об этом около нескольких минут назад .... –

7

$element является одним из четырех местных жителей, которые $compileProvider Придает $controllerProvider которая затем даны $injector. Инжектор вводит местные жители в функцию вашего контроллера только в случае его запроса.

Четыре местные жители:

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

Официальная документация: AngularJS $compile Service API Reference - controller

Исходный код из 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

Я не знаю, что вы точно значит, но надеюсь, что это поможет вам.
этой директивой вы можете получить доступ к элементу DOM внутри контроллера
это образец, который поможет вам сосредоточиться элемент внутри контроллера

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

сейчас, внутри HTML

<input scope-element="txtMessage" > 

затем, внутри контроллера:

.controller('messageController', ['$scope', function ($scope) { 
    $scope.txtMessage.focus(); 
}]) 
Смежные вопросы