Як отримати доступ до змінної $ range в консолі браузера за допомогою AngularJS?


1239

Я хотів би отримати доступ до своєї $scopeзмінної в консолі JavaScript Chrome. Як це зробити?

Я не можу бачити $scopeні назву свого модуля myappв консолі як змінної.


85
Для налагодження я зазвичай встановлюю window.MY_SCOPE = $scope;перше в своїй функції контролера.
Джейсон Гімаат

6
Якщо ви розглядаєте розробку / тестування в Firefox, ви також можете використовувати AngScope - невелике розширення, яке відображає $scopeоб'єкти вибраних елементів DOM в інспекторі DOM Firebug.
Кос Пров

@JasonGoemaat чому не використовувати вікно. $ Range = $ range; так що ви можете просто використовувати $ range, а не MY_SCOPE - я не помітив жодних проблем, але, можливо, мені не вистачає проблеми з безпекою чи чогось іншого.
Джеймс Гентес

8
Тільки для наочності, хтось, хто не знайомий з кутом, може заплутатися і подумати, що $ range магічно доступний у консолі, якби щойно бачив, що він використовується таким чином. Крім того, якщо ви помилково використовуєте область в декларації директиви і $ range в коді, наприклад, ви використовуєте це на об'єкті вікна, а не помилку.
Джейсон Гімаат

Відповіді:


1759

Виберіть елемент на панелі HTML інструментів розробника та введіть це в консолі:

angular.element($0).scope()

У WebKit і Firefox $0- це посилання на вибраний вузол DOM на вкладці елементів, тож цим ви отримуєте вибрану область DOM-вузла, роздруковану на консолі.

Ви також можете орієнтувати область на ідентифікатор елемента, наприклад:

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

Доповнення / розширення

Існує кілька дуже корисних розширень для Chrome, які ви хочете перевірити:

  • Батаранг . Це вже деякий час.

  • ng-інспектор . Це найновіший варіант, і як випливає з назви, він дозволяє перевірити сферу застосування програми.

Гра з jsFiddle

Працюючи з jsfiddle, ви можете відкрити скрипку в режимі шоу , додавши /showв кінці URL-адреси. Якщо ви працюєте таким чином, у вас є доступ до angularглобального. Ви можете спробувати тут:

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/


Дякую. Коли я намагаюся встановити Batarang, він говорить мені, що ваш комп'ютер не підтримується, у мене є ubuntu, якісь ідеї?
murtaza52

@ jm- angular.element($0).scope(), це працює, поки ви не спробуєте викликати деякі методи. Я спробував, і чомусь у цьому налаштуваннях неможливі запити HTTP?
кртек

41
Зауважте, що якщо ви відключите інформацію про налагодження, ви завжди будете не визначені за допомогою цього методу. Цьому призначено і може запобігти .. .well, не вимикаючи інформацію про налагодження в $ compileProvider
Robba

6
альтернатива angular.element ($ 0) .scope (): ви також можете зробити $ ($ 0) .scope ()
користувач2954463

1
@jaime повинен згадати, як знову ввімкнути отримання області з елемента, коли його було вимкнено для продуктивності.
enorl76

187

Щоб покращити відповідь 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();

3
angular містить підмножину jquery, тож ви завжди можете використовувати пізніший синтаксис (якщо він правильний), я не впевнений, що це
Pizzaiola Gorgonzola

3
Я закінчився angular.element(document.body).scope(), дякую!
Олексій Сороколетов


37

Це спосіб отримати масштаб без Batarang, ви можете:

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

Або якщо ви хочете знайти свою область дії за назвою контролера, зробіть це:

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

Після внесення змін до вашої моделі вам потрібно буде застосувати зміни до DOM, зателефонувавши:

scope.$apply();

4
Як ця відповідь має стільки результатів? Для цього вам не потрібен jQuery! angular.element- це вже метод вибору елементів. Перестаньте говорити, що вам потрібен jQuery для таких простих завдань, як вибір елемента за його id!
Кієотичний

3
Я не сказав, що вам це потрібно. Що я говорю, якщо у вас його вже є, ви могли б використовувати його так.
BraveNewMath

4
angular.element вже робить те, для чого ви використовуєте jQuery. Насправді, якщо jQuery доступний angular.element, це псевдонім jQuery. Ви без потреби ускладнюєте свій код. angular.element('#selectorId')і angular.element('[ng-controller=myController]')те ж саме, лише з меншим кодом. Ви також можете зателефонуватиangular.element('#selectorId'.toString())
Kyeotic

8
@Tyrsius, можливо, ваш відгук може бути менш звинувачувальним і злим і трохи більш професійним?
Тасс

6
@Tass Ви маєте рацію, я був марно грубим. Прошу пробачення. Досить сказати, що те саме робиться двічі.
Кієотичний

31

Десь у вашому контролері (часто останній рядок є гарним місцем), поставте

console.log($scope);

Якщо ви хочете побачити внутрішню / неявну область, скажімо всередині ng-повтору, щось подібне спрацює.

<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


10

Одне застереження до багатьох з цих відповідей: якщо ви псевдонімом свого контролера, об'єкти сфери дії будуть знаходитись в об'єкті, що знаходиться у поверненому об'єкті scope().

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


Контролер є доступним для перегляду (отже , до консолі) як властивість $scope, з ім'ям $ctrlза умовчанням, незалежно від перейменовувати чи з допомогою controllerAsчи ні. Я не розумію, де ви бачили "застереження" в існуючих відповідях. Зауважимо, більшість відповідей тут були надані ще тоді, коли controllerAsце не було звичною практикою.
дао

Правильно. Коли ці відповіді були надані, controllerAsце не було звичною практикою, тому для новачків, які, можливо, слідкували за «кулінарною книжкою», яка розповідала їм про псевдонім контролера, але вона не бачила властивостей без використання псевдоніма. Речі рухалися швидко два роки тому.
Майкл Блекберн

8

Я погоджуюся, що найкраще - це Батаранг $scopeпісля вибору об'єкта (він такий же, як angular.element($0).scope()і навіть коротший, з jQuery: $($0).scope()(мій улюблений))

Крім того, якщо у мене, як у мене, у вас є головна сфера застосування bodyелемента, це $('body').scope()чудово працює.


7

Щоб додати та покращити інші відповіді, в консолі введіть, $($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 .


5

Огляньте елемент, а потім скористайтеся цим у консолі

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

5

Просто призначте $scopeяк глобальну змінну. Проблема вирішена.

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

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

Згадав уже @JasonGoemaat, але додав його як відповідну відповідь на це питання.


4

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

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


3

Зазвичай я використовую для цього функцію jQuery data ():

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

На даний момент вибраний товар у хромовому інспекторі DOM. $ 1, $ 2 .. і так далі - це раніше вибрані елементи.


2

Скажіть, ви хочете отримати доступ до сфери застосування на зразок елемента

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

Ви можете використовувати наступне в консолі:

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

Це дасть вам змогу в цьому елементі.


1
нам тут не потрібен "document.querySelector"
Степан Суворов

1

На консолі 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 введіть тут опис зображення


1

Для цього також потрібно встановити 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;
        }

0

в кутовій ми отримуємо елемент jquery за допомогою angular.element () .... дозволяє c ...

angular.element().scope();

приклад:

<div id=""></div>


0

Лише для налагодження я ставлю це до запуску контролера.

   window.scope = $scope;

  $scope.today = new Date();

І ось як я цим користуюся.

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

потім видаліть його, коли я закінчу налагодження.


-1

Помістіть у вашому коді точку перерви десь близько до посилання на змінну $ range (щоб розмір $ знаходився в поточній області "звичайний старий JavaScript"). Тоді ви можете перевірити значення $ range в консолі.


-6

Просто визначте змінну JavaScript за межами області та призначте її для вашої сфери дії у контролері:

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

Це воно! Він повинен працювати у всіх браузерах (перевірений принаймні в Chrome і Mozilla).

Це працює, і я використовую цей метод.


2
Використання глобальних змінних є поганою практикою, але, мабуть, це нормально в більшості випадків. Це лише для налагодження; Але все-таки потрібно бути обережним, щоб не використовувати одне і те ж ім’я змінної двічі.
Педро Аффонсо

3
Це погана ідея, оскільки вимагає змінити вихідний код. Це дратує, навіть якщо це ваш власний код, і неможливо, якщо це щось працює на іншому сервері. Навіть якщо ви можете змінити код, тоді вам слід пам'ятати, щоб скасувати його. Тож, хоча це може працювати, це не найкраща практика.
Джим Девіс

1
@JimDavis Загалом я погоджуюся, але є випадки, коли це робиться корисно: тимчасово змінюючи джерела, ви можете дозволити коду робити те, що вам доведеться робити вручну знову і знову. Тож, коли проблема відчуває складність, і налагодження займе багато часу, я змінюю код. Скасування змін тривіально за допомогою правильного інструменту (git).
maaartinus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.