Как мне получить доступ к переменной $ scope в консоли браузера с помощью AngularJS?

Я хочу получить доступ к моей переменной $scope в консоли JavaScript Chrome. Как я могу это сделать?

Я не вижу ни $scope, ни имя моего модуля myapp в консоли как переменные.


person murtaza52    schedule 06.12.2012    source источник
comment
Для отладки я обычно первым делом устанавливаю window.MY_SCOPE = $scope; в своей функции контроллера.   -  person Jason Goemaat    schedule 31.05.2013
comment
Если вы планируете разработку / тестирование в Firefox, вы также можете использовать AngScope, небольшое расширение, которое отображает $scope объекты выбранных элементов DOM в инспекторе DOM Firebug.   -  person Kos Prov    schedule 15.01.2014
comment
@JasonGoemaat, почему бы не использовать window. $ Scope = $ scope; так что вы можете просто использовать $ scope, а не MY_SCOPE - я не заметил никаких проблем, но, возможно, мне не хватает проблемы безопасности или чего-то еще.   -  person James Gentes    schedule 05.06.2015
comment
Просто для ясности: кто-то новичок в angular может запутаться и подумать, что $ scope волшебным образом доступен в консоли, если он просто увидел, что он используется таким образом. Кроме того, если вы затем ошибочно используете область видимости в объявлении директивы и, например, $ scope в коде, вы будете использовать это в объекте окна вместо получения ошибки.   -  person Jason Goemaat    schedule 05.06.2015


Ответы (19)


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

angular.element($0).scope()

В WebKit и Firefox $0 - это ссылка на выбранный узел DOM на вкладке элементов, поэтому сделав это, вы получите выбранную область видимости узла DOM, распечатанную в консоли.

Вы также можете настроить таргетинг на область действия по идентификатору элемента, например:

angular.element(document.getElementById('yourElementId')).scope()

Дополнения / расширения

Есть несколько очень полезных расширений Chrome, которые вы, возможно, захотите попробовать:

  • Батаранг. Это было какое-то время.

  • ng-Inspector. Это самый новый, и, как следует из названия, он позволяет вам проверять области действия вашего приложения.

Игра с jsFiddle

При работе с jsfiddle вы можете открыть скрипт в режиме show, добавив /show в конце URL-адреса. При таком запуске у вас есть доступ к angular global. Вы можете попробовать это здесь:

http://jsfiddle.net/jaimem/Yatbt/show

jQuery Lite

Если вы загрузите jQuery до AngularJS, angular.element можно передать селектор jQuery. Таким образом, вы можете проверить объем контроллера с помощью

angular.element('[ng-controller=ctrl]').scope()

Кнопки

 angular.element('button:eq(1)').scope()

... и так далее.

Возможно, вы действительно захотите использовать глобальную функцию, чтобы упростить задачу:

window.SC = function(selector){
    return angular.element(selector).scope();
};

Теперь ты мог это сделать

SC('button:eq(10)')
SC('button:eq(10)').row   // -> value of scope.row

Проверьте здесь: http://jsfiddle.net/jaimem/DvRaR/1/show/

person jaime    schedule 06.12.2012
comment
Спасибо. Когда я пытаюсь установить Batarang, он сообщает мне, что ваш компьютер не поддерживается, у меня есть Ubuntu, есть идеи? - person murtaza52; 06.12.2012
comment
@ jm- начиная с angular.element($0).scope(), он работает, пока вы не попытаетесь вызвать какие-то методы. Я пробовал, и по какой-то причине в этой настройке невозможны HTTP-запросы? - person krtek; 09.04.2013
comment
С помощью chrome в jsfiddle вы можете перейти к рамке показа с раскрывающимся списком в нижней части окна. Обычно он говорит <top frame>, и вы хотите выбрать result( fiddle.jsshell.net/ ), чтобы консоль находилась в контексте работающего фрейма. - person Jason Goemaat; 31.05.2013
comment
@jaime я попробовал ваш ответ (angular.element ($ 0) .scope ()), но вместо этого получил свою область видимости, i [объект объекта] - person ishwr; 19.02.2014
comment
@ murtaza52, Батаранг у меня работает на Ubuntu. Возможно, они устранили проблему, с которой вы столкнулись с тех пор. Я использую Батаранг 0.4.3. - person Tyler Rick; 04.04.2014
comment
Обратите внимание: если вы отключите отладочную информацию, вы всегда получите значение undefined, используя этот метод. Это предназначено и может быть предотвращено .. ну, не отключая отладочную информацию в $ compileProvider. - person Robba; 18.03.2015
comment
альтернатива angular.element ($ 0) .scope (): вы также можете сделать $ ($ 0) .scope () - person user2954463; 18.11.2015
comment
Предупреждение - Батаранг делает странные вещи с вашим приложением, для меня это было тонкое нарушение работы приложения на некоторых выражениях без каких-либо видимых намеков на то, что эта поломка произошла из-за Батаранга. - person dolzenko; 06.04.2016
comment
Возможно, стоит упомянуть, что изменения, которые вы вносите в $ наблюдаемые переменные, не окажут никакого эффекта. Для этого вам также нужно вызвать theScope. $ Apply (). - person AdamAL; 21.10.2016
comment
Я не могу сосчитать, сколько раз я возвращался к этому ответу. Спасибо, Хайме, SO и Google - person Bartho Bernsmann; 16.02.2018
comment
@jaime следует упомянуть, как повторно включить получение области видимости из элемента, когда он был отключен для повышения производительности. - person enorl76; 12.02.2019

Чтобы улучшить ответ jm ...

// Access whole scope
angular.element(myDomElement).scope();

// Access and change variable in scope
angular.element(myDomElement).scope().myVar = 5;
angular.element(myDomElement).scope().myArray.push(newItem);

// Update page to reflect changed variables
angular.element(myDomElement).scope().$apply();

Или, если вы используете jQuery, то же самое ...

$('#elementId').scope();
$('#elementId').scope().$apply();

Еще один простой способ получить доступ к элементу DOM из консоли (как упоминалось в jm) - щелкнуть по нему на вкладке «элементы», и он автоматически сохраняется как $0.

angular.element($0).scope();
person Simon East    schedule 02.04.2013
comment
angular содержит подмножество jquery, поэтому вы всегда можете использовать более поздний синтаксис (если он правильный), я не уверен, что это - person Pizzaiola Gorgonzola; 09.04.2014
comment
Я получил angular.element(document.body).scope(), спасибо! - person Alex Sorokoletov; 19.11.2016

Если вы установили Batarang

Тогда вы можете просто написать:

$scope

когда у вас есть элемент, выбранный в представлении элементов в хроме. Ссылка - https://github.com/angular/angularjs-batarang#console

person chrismarx    schedule 06.09.2013

Это способ получить объем без Батаранга, вы можете:

var scope = angular.element('#selectorId').scope();

Или, если вы хотите найти свою область действия по имени контроллера, сделайте следующее:

var scope = angular.element('[ng-controller=myController]').scope();

После того, как вы внесете изменения в свою модель, вам нужно будет применить изменения к DOM, вызвав:

scope.$apply();
person BraveNewMath    schedule 04.06.2014
comment
Как у этого ответа столько голосов? Для этого вам не нужен jQuery! angular.element уже является методом выбора элемента. Перестаньте говорить, что вам нужен jQuery для простых задач, таких как выбор элемента по его идентификатору! - person Kyeotic; 17.06.2015
comment
Я не говорил, что тебе это нужно. Я говорю, что если он у вас уже есть, вы можете использовать его вот так. - person BraveNewMath; 18.06.2015
comment
angular.element уже выполняет то, для чего вы используете jQuery. Фактически, если jQuery доступен, angular.element является псевдонимом для jQuery. Вы без нужды усложняете свой код. angular.element('#selectorId') и angular.element('[ng-controller=myController]') делают то же самое, только с меньшим количеством кода. Вы также можете позвонить angular.element('#selectorId'.toString()) - person Kyeotic; 18.06.2015
comment
@Tyrsius, возможно, ваш отзыв был бы менее обвинительным и злым, а немного более профессиональным? - person Tass; 29.10.2015
comment
@Tass Вы правы, я был напрасно грубым. Я прошу прощения. Достаточно сказать, что одно и то же делается дважды. - person Kyeotic; 29.10.2015
comment
Чтение беседы @Tyrsius и @Tass angular.element будет псевдонимом для jQuery, если он включен, в противном случае это будет объект jQLite. Если это так, его .find() не будет иметь такой же функциональности. Согласно документам: find() - Limited to lookups by tag name. Мысль об этом стоит добавить для того, кто не понимал этого, читая это. (Как и я изначально). - person ste2425; 16.11.2015
comment
Я обновил код. В то время я был новичком в angular и с тех пор отошел от него. Я приглашаю вас обновить код, чтобы сделать его более полезным. - person BraveNewMath; 18.11.2015

Где-нибудь в вашем контроллере (часто последняя строка - хорошее место), поместите

console.log($scope);

Если вы хотите увидеть внутреннюю / неявную область видимости, скажем, внутри ng-repeat, что-то вроде этого будет работать.

<li ng-repeat="item in items">
   ...
   <a ng-click="showScope($event)">show scope</a>
</li>

Затем в вашем контроллере

function MyCtrl($scope) {
    ...
    $scope.showScope = function(e) {
        console.log(angular.element(e.srcElement).scope());
    }
}

Обратите внимание, что выше мы определяем функцию showScope () в родительской области, но это нормально ... дочерняя / внутренняя / неявная область может получить доступ к этой функции, которая затем распечатывает область на основе события и, следовательно, область, связанную с элемент, вызвавший событие.

Предложение @ jm- тоже работает, , но я не думаю, что оно работает внутри jsFiddle. Я получаю эту ошибку в jsFiddle внутри Chrome:

> angular.element($0).scope()
ReferenceError: angular is not defined

person Mark Rajcok    schedule 06.12.2012

Одно предостережение ко многим из этих ответов: если вы укажете псевдоним для своего контроллера, ваши объекты области будут в объекте в объекте, возвращаемом из scope().

Например, если ваша директива контроллера создана так: <div ng-controller="FormController as frm">, тогда для доступа к свойству startDate вашего контроллера вы должны вызвать angular.element($0).scope().frm.startDate

person Michael Blackburn    schedule 24.02.2015
comment
Контроллер доступен для просмотра (следовательно, для консоли) как свойство $scope, названного по умолчанию $ctrl, независимо от того, переименовываете ли вы его с помощью controllerAs или нет. Я не понимаю, где вы увидели предостережение в существующих ответах. Обратите внимание, что большинство ответов здесь были даны еще тогда, когда controllerAs не было обычной практикой. - person tao; 14.06.2017
comment
Верно. Когда были даны эти ответы, controllerAs не было обычной практикой, поэтому это сбивало с толку новичков, которые, возможно, следили за кулинарной книгой, в которой им предлагалось использовать псевдоним контроллера, но затем не видели свойства без использования псевдонима. Два года назад дела шли быстро. - person Michael Blackburn; 16.06.2017

Чтобы добавить и улучшить другие ответы, в консоли введите $($0), чтобы получить элемент. Если это приложение Angularjs, по умолчанию загружается версия jQuery lite.

Если вы не используете jQuery, вы можете использовать angular.element ($ 0), как в:

angular.element($0).scope()

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

$.fn.jquery

Если вы проверили элемент, текущий выбранный элемент доступен через ссылку API командной строки $ 0. Эта ссылка есть как в Firebug, так и в Chrome.

Однако инструменты разработчика Chrome сделают доступными последние пять элементов (или объектов кучи), выбранных с помощью свойств с именами $ 0, $ 1, $ 2, $ 3, $ 4, используя эти ссылки. На последний выбранный элемент или объект можно ссылаться как на $ 0, на второй по времени - как на $ 1 и так далее.

Вот справочник по API командной строки для Firebug, в котором перечислены ссылки.

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

Вот некоторые другие вещи, которые вы можете использовать:

  • Просмотр родительской области элементов:

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

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

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

  • Вы можете посмотреть на корневую область:

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

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

$($0).isolateScope()

См. Советы и рекомендации по отладке незнакомого кода Angularjs для получения более подробной информации и примеров.

person James Drinkard    schedule 02.08.2016

Я согласен, что лучше всего подходит Батаранг с $scope после выбора объекта (он такой же, как angular.element($0).scope(), или даже короче с jQuery: $($0).scope() (мой любимый))

Кроме того, если, как и я, у вас есть основная область видимости на элементе body, $('body').scope() отлично работает.

person Dorian    schedule 23.01.2014

Просто назначьте $scope в качестве глобальной переменной. Задача решена.

app.controller('myCtrl', ['$scope', '$http', function($scope, $http) {
    window.$scope = $scope;
}

На самом деле нам нужно $scope чаще в разработке, чем в производстве.

Уже упоминалось @JasonGoemaat, но добавляло его как подходящий ответ на этот вопрос.

person Sandeep    schedule 01.11.2016

Осмотрите элемент, затем используйте его в консоли.

s = $($0).scope()
// `s` is the scope object if it exists
person geg    schedule 07.12.2015

Я использовал angular.element($(".ng-scope")).scope(); в прошлом, и он отлично работает. Хорошо, только если у вас есть только одна область приложения на странице или вы можете сделать что-то вроде:

angular.element($("div[ng-controller=controllerName]")).scope(); or angular.element(document.getElementsByClassName("ng-scope")).scope();

person Mike    schedule 13.12.2016

Я обычно использую для этого функцию jQuery data ():

$($0).data().$scope

$ 0 - это текущий выбранный элемент в инспекторе Chrome DOM. $ 1, $ 2 и т. Д. Являются ранее выбранными элементами.

person wojtekc    schedule 03.08.2015

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

<div ng-controller="hw"></div>

Вы можете использовать в консоли следующее:

angular.element(document.querySelector('[ng-controller=hw]')).scope();

Это даст вам область видимости для этого элемента.

person Praym    schedule 03.09.2014
comment
нам здесь не нужен document.querySelector - person Stepan Suvorov; 20.05.2015

На консоли Chrome:

 1. Select the **Elements** tab
 2. Select the element of your angular's scope. For instance, click on an element <ui-view>, or <div>, or etc.
 3. Type the command **angular.element($0).scope()** with following variable in the angular's scope

Пример

angular.element($0).scope().a
angular.element($0).scope().b

Консоль Chrome  введите описание изображения здесь

person Khachornchit Songsaen    schedule 21.06.2018

Для этого также необходимо установить jQuery, но он отлично работает в среде разработки. Он просматривает каждый элемент, чтобы получить экземпляры областей видимости, а затем возвращает их, помеченные именами контроллеров. Он также удаляет любое свойство, начинающееся с $, которое обычно использует angularjs для своей конфигурации.

let controllers = (extensive = false) => {
            let result = {};
            $('*').each((i, e) => {
                let scope = angular.element(e).scope();
                if(Object.prototype.toString.call(scope) === '[object Object]' && e.hasAttribute('ng-controller')) {
                    let slimScope = {};
                    for(let key in scope) {
                        if(key.indexOf('$') !== 0 && key !== 'constructor' || extensive) {
                            slimScope[key] = scope[key];
                        }
                    }
                    result[$(e).attr('ng-controller')] = slimScope;
                }
            });

            return result;
        }
person Luke Pring    schedule 18.06.2019

в angular мы получаем элемент jquery с помощью angular.element () .... позволяет c ...

angular.element().scope();

пример:

<div id=""></div>

person Rizo    schedule 12.12.2017

Только для целей отладки я помещаю это в начало контроллера.

   window.scope = $scope;

  $scope.today = new Date();

И вот как я его использую.

введите здесь описание изображения

затем удалите его, когда я закончу отладку.

person mcvkr    schedule 08.03.2019

Поместите точку останова в свой код где-нибудь рядом со ссылкой на переменную $ scope (так, чтобы $ scope находилась в текущей области "простого старого JavaScript"). Затем вы можете проверить значение $ scope в консоли.

person Chris Halcrow    schedule 18.05.2017

Просто определите переменную JavaScript вне области видимости и назначьте ее своей области действия в контроллере:

var myScope;
...
app.controller('myController', function ($scope,log) {
     myScope = $scope;
     ...

Вот и все! Он должен работать во всех браузерах (проверено как минимум в Chrome и Mozilla).

Он работает, и я использую этот метод.

person Asqan    schedule 17.06.2015
comment
Использование глобальных переменных - плохая практика, но я думаю, что в большинстве случаев это нормально. В конце концов, это только для отладки; Но все же вы должны быть осторожны, чтобы не использовать одно и то же имя переменной дважды. - person Pedro Affonso; 29.08.2015
comment
Это плохая идея, потому что вам нужно изменить исходный код. Это раздражает, даже если это ваш собственный код, и невозможно, если это что-то работает на другом сервере. Даже если вы можете изменить код, вы должны не забыть отменить его. Так что, хотя это может сработать, это не лучшая практика. - person Jim Davis; 06.10.2015
comment
@JimDavis В целом я согласен, но бывают случаи, когда это полезно: временно изменяя источники, вы можете позволить коду делать то, что вам придется делать вручную снова и снова. Поэтому, когда проблема кажется сложной и отладка займет много времени, я модифицирую код. Отменить изменения с помощью подходящего инструмента (git) несложно. - person maaartinus; 08.09.2016