Je souhaite accéder à ma $scope
variable dans la console JavaScript de Chrome. Comment je fais ça?
Je ne vois $scope
ni le nom de mon module myapp
dans la console sous forme de variables.
Je souhaite accéder à ma $scope
variable dans la console JavaScript de Chrome. Comment je fais ça?
Je ne vois $scope
ni le nom de mon module myapp
dans la console sous forme de variables.
Réponses:
Choisissez un élément dans le panneau HTML des outils de développement et saisissez-le dans la console:
angular.element($0).scope()
Dans WebKit et Firefox, $0
est une référence au nœud DOM sélectionné dans l'onglet Éléments, donc en faisant cela, vous obtenez la portée du nœud DOM sélectionné imprimée dans la console.
Vous pouvez également cibler la portée par ID d'élément, comme ceci:
angular.element(document.getElementById('yourElementId')).scope()
Extensions / extensions
Il existe des extensions Chrome très utiles que vous voudrez peut-être consulter:
Batarang . Cela existe depuis un certain temps.
ng-inspecteur . C'est le plus récent, et comme son nom l'indique, il vous permet d'inspecter les étendues de votre application.
Jouer avec jsFiddle
Lorsque vous travaillez avec jsfiddle, vous pouvez ouvrir le violon en mode show en ajoutant /show
à la fin de l'URL. Lorsque vous exécutez comme ceci, vous avez accès au angular
global. Vous pouvez l'essayer ici:
http://jsfiddle.net/jaimem/Yatbt/show
jQuery Lite
Si vous chargez jQuery avant AngularJS, vous angular.element
pouvez passer un sélecteur jQuery. Vous pouvez donc inspecter la portée d'un contrôleur avec
angular.element('[ng-controller=ctrl]').scope()
D'un bouton
angular.element('button:eq(1)').scope()
... etc.
Vous voudrez peut-être utiliser une fonction globale pour le rendre plus facile:
window.SC = function(selector){
return angular.element(selector).scope();
};
Maintenant tu peux faire ça
SC('button:eq(10)')
SC('button:eq(10)').row // -> value of scope.row
Vérifiez ici: http://jsfiddle.net/jaimem/DvRaR/1/show/
angular.element($0).scope()
, cela fonctionne jusqu'à ce que vous essayiez d'appeler certaines méthodes. J'ai essayé, et pour une raison quelconque, aucune demande HTTP n'est possible dans cette configuration?
Pour améliorer la réponse de 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();
Ou si vous utilisez jQuery, cela fait la même chose ...
$('#elementId').scope();
$('#elementId').scope().$apply();
Un autre moyen facile d'accéder à un élément DOM à partir de la console (comme l'a mentionné jm) consiste à cliquer dessus dans l'onglet «Éléments», et il est automatiquement stocké sous $0
.
angular.element($0).scope();
angular.element(document.body).scope()
, merci!
Si vous avez installé Batarang
Ensuite, vous pouvez simplement écrire:
$scope
lorsque vous avez l'élément sélectionné dans la vue des éléments en chrome. Réf - https://github.com/angular/angularjs-batarang#console
C'est un moyen de se rendre à portée sans Batarang, vous pouvez faire:
var scope = angular.element('#selectorId').scope();
Ou si vous souhaitez trouver votre portée par nom de contrôleur, procédez comme suit:
var scope = angular.element('[ng-controller=myController]').scope();
Après avoir apporté des modifications à votre modèle, vous devrez appliquer les modifications au DOM en appelant:
scope.$apply();
angular.element
est déjà une méthode de sélection d'élément. Arrêtez de dire que vous avez besoin de jQuery pour des tâches simples comme la sélection d'un élément par son identifiant!
angular.element
fait déjà la chose pour laquelle vous utilisez jQuery. En fait, si jQuery est disponible, angular.element
c'est un alias pour jQuery. Vous compliquez inutilement votre code. angular.element('#selectorId')
et angular.element('[ng-controller=myController]')
faites la même chose, mais avec moins de code. Vous pourriez aussi bien appelerangular.element('#selectorId'.toString())
Quelque part dans votre contrôleur (souvent la dernière ligne est un bon endroit), mettez
console.log($scope);
Si vous voulez voir une portée interne / implicite, disons à l'intérieur d'une répétition ng, quelque chose comme ça fonctionnera.
<li ng-repeat="item in items">
...
<a ng-click="showScope($event)">show scope</a>
</li>
Puis dans votre manette
function MyCtrl($scope) {
...
$scope.showScope = function(e) {
console.log(angular.element(e.srcElement).scope());
}
}
Notez que ci-dessus, nous définissons la fonction showScope () dans la portée parent, mais ce n'est pas grave ... la portée enfant / intérieure / implicite peut accéder à cette fonction, qui imprime ensuite la portée en fonction de l'événement, et donc la portée associée à l'élément qui a déclenché l'événement.
La suggestion de @ jm- fonctionne également, mais je ne pense pas que cela fonctionne à l'intérieur d'un jsFiddle. Je reçois cette erreur sur jsFiddle dans Chrome:
> angular.element($0).scope()
ReferenceError: angular is not defined
Une mise en garde à plusieurs de ces réponses: si vous alias votre contrôleur, vos objets de portée se trouveront dans un objet de l'objet renvoyé scope()
.
Par exemple, si votre directive contrôleur est créée comme ceci:
<div ng-controller="FormController as frm">
alors pour accéder à une startDate
propriété de votre contrôleur, vous appelleriezangular.element($0).scope().frm.startDate
$scope
, nommé $ctrl
par défaut, indépendamment du fait que vous le renommiez en utilisant controllerAs
ou non. Je ne comprends pas où vous avez vu une "mise en garde" dans les réponses existantes. Notez que la plupart des réponses ici ont été fournies alors que ce controllerAs
n'était pas une pratique courante.
controllerAs
n'était pas une pratique courante, donc c'était déroutant pour les débutants qui suivaient peut-être un "livre de cuisine" qui leur disait d'alias le contrôleur, mais de ne pas voir les propriétés sans utiliser l'alias. Les choses allaient vite il y a deux ans.
Je suis d'accord que le meilleur est Batarang avec c'est $scope
après avoir sélectionné un objet (c'est le même angular.element($0).scope()
ou même plus court avec jQuery: $($0).scope()
(mon préféré))
De plus, si comme moi vous avez votre portée principale sur l' body
élément, cela $('body').scope()
fonctionne très bien.
Pour ajouter et améliorer les autres réponses, dans la console, entrez $($0)
pour obtenir l'élément. S'il s'agit d'une application Angularjs, une version jQuery lite est chargée par défaut.
Si vous n'utilisez pas jQuery, vous pouvez utiliser angular.element ($ 0) comme dans:
angular.element($0).scope()
Pour vérifier si vous avez jQuery et la version, exécutez cette commande dans la console:
$.fn.jquery
Si vous avez inspecté un élément, l'élément actuellement sélectionné est disponible via la référence d'API de ligne de commande $ 0. Firebug et Chrome ont cette référence.
Cependant, les outils de développement Chrome rendront disponibles les cinq derniers éléments (ou objets de tas) sélectionnés via les propriétés nommées $ 0, $ 1, $ 2, $ 3, $ 4 en utilisant ces références. L'élément ou l'objet sélectionné le plus récemment peut être référencé comme $ 0, le deuxième plus récent comme $ 1 et ainsi de suite.
Voici la référence de l'API de ligne de commande pour Firebug qui répertorie ses références.
$($0).scope()
retournera la portée associée à l'élément. Vous pouvez voir ses propriétés tout de suite.
Certaines autres choses que vous pouvez utiliser sont:
$($0).scope().$parent
.
$($0).scope().$parent.$parent
$($0).scope().$root
$($0).isolateScope()
Voir Trucs et astuces pour déboguer le code Angularjs inconnu pour plus de détails et d'exemples.
Attribuez simplement $scope
une variable globale. Problème résolu.
app.controller('myCtrl', ['$scope', '$http', function($scope, $http) {
window.$scope = $scope;
}
Nous avons en fait besoin $scope
plus souvent en développement qu'en production.
Mentionné déjà par @JasonGoemaat mais en l'ajoutant comme réponse appropriée à cette question.
Je l'ai utilisé angular.element($(".ng-scope")).scope();
dans le passé et cela fonctionne très bien. Ce n'est bon que si vous n'avez qu'une seule étendue d'application sur la page, ou si vous pouvez faire quelque chose comme:
angular.element($("div[ng-controller=controllerName]")).scope();
ou angular.element(document.getElementsByClassName("ng-scope")).scope();
Supposons que vous souhaitiez accéder à la portée de l'élément comme
<div ng-controller="hw"></div>
Vous pouvez utiliser les éléments suivants dans la console:
angular.element(document.querySelector('[ng-controller=hw]')).scope();
Cela vous donnera la portée de cet élément.
Sur la console de 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
Exemple
angular.element($0).scope().a
angular.element($0).scope().b
Cela nécessite que jQuery soit également installé, mais fonctionne parfaitement pour un environnement de développement. Il examine chaque élément pour obtenir les instances des étendues, puis les renvoie étiquetées avec leurs noms de contrôleur. Il supprime également toute propriété commençant par un $, ce que angularjs utilise généralement pour sa configuration.
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;
}
Placez un point d'arrêt dans votre code à un endroit proche d'une référence à la variable $ scope (de sorte que $ scope se trouve dans la portée 'plain old JavaScript'). Ensuite, vous pouvez inspecter la valeur $ scope dans la console.
Définissez simplement une variable JavaScript en dehors de la portée et affectez-la à votre portée dans votre contrôleur:
var myScope;
...
app.controller('myController', function ($scope,log) {
myScope = $scope;
...
C'est ça! Il devrait fonctionner dans tous les navigateurs (testé au moins dans Chrome et Mozilla).
Cela fonctionne, et j'utilise cette méthode.
window.MY_SCOPE = $scope;
première chose dans la fonction de mon contrôleur.