Подтвердить что ты не робот

В AngularJS, как вы находите все области на странице?

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

Но есть ли прямой способ найти все области на странице?

Аналогично, учитывая элемент HTML, существует ли прямой способ найти свою охватывающую область?

4b9b3361

Ответ 1

вы можете видеть все области на странице с помощью этого селектора CSS

.ng-scope { border: 1px solid red; }

и все привязки:

.ng-binding { border: 1px solid red; }

Затем вы можете получить их путем преобразования элемента DOM в селектор

var selector = angular.element(some_dom_element);

Затем используйте селектор для извлечения области/контроллера/инжектора

var scope = selector.scope();
var controller = selector.controller();
var injector = selector.injector();

Ответ 2

Не все области привязаны к элементам. Если вам нужна область all на странице, пройдите по дереву областей следующим образом:

function getScopes(root) {
    var scopes = [];

    function visit(scope) {
        scopes.push(scope);
    }
    function traverse(scope) {
        visit(scope);
        if (scope.$$nextSibling)
            traverse(scope.$$nextSibling);
        if (scope.$$childHead)
            traverse(scope.$$childHead);
    }

    traverse(root);
    return scopes;
}

getScopes($rootScope)

Ответ 3

Я не знаю, почему это было бы полезно для вас, но вы можете это сделать:

scopeElements = document.getElementsByClassName('ng-scope');
scopes = [].map.call(scopeElements, function(e){ return angular.element(e).scope(); })

Другим вариантом является перемещение дерева области видимости, начиная с области корня, используя наш частный apis: $$ childHead и $$ nextSibling.

Скорее всего, вы просто хотите увидеть, где находятся границы области видимости, и вы можете сделать это с помощью этого:

scopeElements = document.getElementsByClassName('ng-scope');
angular.element(scopeElements).css('border', '1px solid red');

Затем вы можете просто использовать веб-инспектор, чтобы выбрать интересующий элемент и получить его область действия:

angular.element($0).scope();

Ответ 4

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

https://github.com/angular/angularjs-batarang

Ответ 5

Вы можете узнать область применения элемента:

$(element).scope()

или

angular.element(element).scope()

Я не думаю, что есть способ легко получить все области на странице (кроме навигации по корневой области).

Ответ 6

Вам необходимо разработать приложение в браузере Google Chrome (если вы его еще не используете), и вы можете использовать удивительное расширение Batarang, которое добавляет новую специальную панель AngularJS к инструментам разработчика. Вы можете видеть все области там, каковы отношения между ними и какое значение имеют все его атрибуты.

http://blog.angularjs.org/2012/07/introducing-angularjs-batarang.html

Ответ 7

В углах есть $rootScope, который является корнем каждой области. У него дочернее поле, а целая иерархия находится внутри $rootScope. Если вы хотите найти область с элементом html, у вас, вероятно, будут проблемы, потому что эта область может быть Изолированной областью. Возможно, у вас есть директива, какая область выделена. Если у вас есть что-то подобное, попробуйте использовать el.isolatedScope()

Ответ 8

В Chrome, используя инструменты разработчика. Я использую консольную командную строку.

Выберите элемент на панели HTML инструментов разработчика и введите его в консоли:

angular.element($0).scope()

или просто щелкните правой кнопкой мыши элемент страницы и выберите: проверить элемент.

$($0).scope() вернет область, связанную с элементом. Вы можете сразу увидеть его свойства.

Чтобы просмотреть родительскую область элементов:

$($0).scope().$parent

Вы также можете связать это:

$($0).scope().$parent.$parent

Вы можете посмотреть область корня:

$($0).scope().$root

Если вы выделили директиву с областью выделения, вы можете посмотреть на нее с помощью

$($0).isolateScope()

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

$($0).scope().$sibling

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

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