Я хотел бы получить доступ к моей $scope
переменной в консоли Chrome JavaScript. Как я могу это сделать?
Я не могу видеть $scope
ни имя моего модуля myapp
в консоли в качестве переменных.
Я хотел бы получить доступ к моей $scope
переменной в консоли Chrome JavaScript. Как я могу это сделать?
Я не могу видеть $scope
ни имя моего модуля myapp
в консоли в качестве переменных.
Ответы:
Выберите элемент на панели HTML инструментов разработчика и введите его в консоли:
angular.element($0).scope()
В WebKit и Firefox $0
это ссылка на выбранный узел DOM на вкладке элементов, поэтому, выполнив это, вы получите область выбранного узла DOM, распечатанную в консоли.
Вы также можете нацелить область видимости по идентификатору элемента, например так:
angular.element(document.getElementById('yourElementId')).scope()
Плагины / расширения
Есть несколько очень полезных расширений Chrome, которые вы можете попробовать:
Batarang . Это было вокруг некоторое время.
нг-инспектор . Это новейшая версия, и, как следует из названия, она позволяет вам осмотреть области своего приложения.
Играя с 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/
angular.element($0).scope()
момента, пока не попробуешь вызвать некоторые методы. Я пытался, и по какой-то причине никакие запросы HTTP невозможны в этой настройке?
Чтобы улучшить ответ 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) - щелкнуть по нему во вкладке «elements», и он автоматически сохранится как $0
.
angular.element($0).scope();
angular.element(document.body).scope()
, спасибо!
Если вы установили Batarang
Тогда вы можете просто написать:
$scope
когда элемент выбран в представлении элементов в Chrome. Ссылка - https://github.com/angular/angularjs-batarang#console
Это способ достичь цели без Batarang, вы можете сделать:
var scope = angular.element('#selectorId').scope();
Или, если вы хотите найти свою область по имени контроллера, сделайте это:
var scope = angular.element('[ng-controller=myController]').scope();
После того, как вы внесете изменения в свою модель, вам нужно применить изменения к DOM, вызвав:
scope.$apply();
angular.element
это уже метод выбора элемента. Перестаньте говорить, что вам нужен jQuery для простых задач, таких как выбор элемента по его идентификатору!
angular.element
уже делает то, что вы используете для jQuery. Фактически, если jQuery доступен angular.element
, это псевдоним для jQuery. Вы без необходимости усложняете свой код. angular.element('#selectorId')
и angular.element('[ng-controller=myController]')
делать то же самое, только с меньшим количеством кода. Вы можете также позвонитьangular.element('#selectorId'.toString())
Где-то в вашем контроллере (часто последняя строка - хорошее место), поставьте
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
Один из предостережений для многих из этих ответов: если вы используете псевдоним вашего контроллера, ваши объекты области видимости будут в объекте в возвращаемом объекте из scope()
.
Например, если ваша директива контроллера создана следующим образом:
<div ng-controller="FormController as frm">
для доступа к startDate
свойству вашего контроллера вы должны вызватьangular.element($0).scope().frm.startDate
$scope
, с именем $ctrl
по умолчанию, независимо от переименовывать ли с помощью controllerAs
или нет. Я не понимаю, где вы видели «предостережение» в существующих ответах. Обратите внимание, что большинство ответов здесь были предоставлены тогда, когда controllerAs
это не было обычной практикой.
controllerAs
это не было обычной практикой, поэтому это было сбивающим с толку для новичков, которые, возможно, следовали «кулинарной книге», в которой указывалось псевдоним контроллера, но затем не видели свойства без использования псевдонима. Все шло быстро два года назад.
Чтобы добавить и улучшить другие ответы, в консоли введите $($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 для получения дополнительной информации и примеров.
Просто назначьте $scope
в качестве глобальной переменной. Задача решена.
app.controller('myCtrl', ['$scope', '$http', function($scope, $http) {
window.$scope = $scope;
}
Нам на самом деле нужно $scope
чаще в разработке, чем в производстве.
Упоминается уже @JasonGoemaat, но добавляет его как подходящий ответ на этот вопрос.
Я использовал angular.element($(".ng-scope")).scope();
в прошлом, и это прекрасно работает. Хорошо только если у вас есть только одна область приложения на странице, или вы можете сделать что-то вроде:
angular.element($("div[ng-controller=controllerName]")).scope();
или angular.element(document.getElementsByClassName("ng-scope")).scope();
Скажем, вы хотите получить доступ к области действия элемента, как
<div ng-controller="hw"></div>
Вы можете использовать следующее в консоли:
angular.element(document.querySelector('[ng-controller=hw]')).scope();
Это даст вам область действия в этом элементе.
На консоли 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
Это также требует установки 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;
}
Поместите точку останова в своем коде где-то рядом со ссылкой на переменную $ scope (так, чтобы область действия $ находилась в текущей области видимости «старого старого JavaScript»). Затем вы можете проверить значение $ scope в консоли.
Просто определите переменную JavaScript за пределами области и назначьте ее своей области в вашем контроллере:
var myScope;
...
app.controller('myController', function ($scope,log) {
myScope = $scope;
...
Это оно! Должно работать во всех браузерах (проверено хотя бы в Chrome и Mozilla).
Это работает, и я использую этот метод.
window.MY_SCOPE = $scope;
первое в своей функции контроллера.