¿Cómo accedo a la variable $ scope en la consola del navegador usando AngularJS?

me gustaria acceder a mi $scope variable en la consola JavaScript de Chrome. ¿Cómo puedo hacer eso?

yo tampoco puedo ver $scope ni el nombre de mi modulo myapp en la consola como variables.

preguntado el 06 de diciembre de 12 a las 11:12

Para la depuración, generalmente configuro window.MY_SCOPE = $scope; Lo primero en mi función de controlador. -

Si está considerando desarrollar/probar en Firefox, también puede usar AngScope, una pequeña extensión que muestra $scope objetos de elementos DOM seleccionados en el Inspector DOM de Firebug. -

@JasonGoemaat por qué no usar window.$scope = $scope; para que pueda simplemente usar $ scope en lugar de MY_SCOPE. No he notado ningún problema, pero tal vez me estoy perdiendo un problema de seguridad o algo así. -

Solo para mayor claridad, alguien nuevo en angular podría confundirse y pensar que $scope estaba mágicamente disponible en la consola si solo viera que se usa de esa manera. Además, si luego usa por error scope en una declaración de directiva y $scope en el código, por ejemplo, estaría usando eso en el objeto de la ventana en lugar de obtener un error. -

19 Respuestas

Elija un elemento en el panel HTML de las herramientas de desarrollo y escriba esto en la consola:

angular.element($0).scope()

In WebKit y firefox, $0 es una referencia al nodo DOM seleccionado en la pestaña de elementos, por lo que al hacer esto obtiene el alcance del nodo DOM seleccionado impreso en la consola.

También puede orientar el alcance por ID de elemento, así:

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

Complementos/Extensiones

Hay algunas extensiones de Chrome muy útiles que tal vez quieras revisar:

  • Batarang. Esto ha existido por un tiempo.

  • ng-inspector. Este es el más nuevo y, como sugiere su nombre, le permite inspeccionar los ámbitos de su aplicación.

Jugando con jsFiddle

Cuando trabaje con jsfiddle, puede abrir el violín en Mostrar modo agregando /show al final de la URL. Cuando se ejecuta de esta manera, tiene acceso a la angular global. Puedes probarlo aquí:

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

jQuery Lite

Si carga jQuery antes que AngularJS, angular.element se le puede pasar un selector jQuery. Entonces podría inspeccionar el alcance de un controlador con

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

de un boton

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

... y así.

Es posible que desee utilizar una función global para hacerlo más fácil:

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

Ahora podrías hacer esto

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

Compruebe aquí: http://jsfiddle.net/jaimem/DvRaR/1/show/

Respondido 15 Oct 17, 15:10

Gracias. Cuando trato de instalar Batarang, me dice que su computadora no es compatible, tengo ubuntu, ¿alguna idea? - murtaza52

@jm- a partir de angular.element($0).scope(), funciona hasta que intenta llamar a algunos métodos. Lo intenté y, por alguna razón, no es posible realizar solicitudes HTTP en esta configuración. - pequeño

Tenga en cuenta que si está deshabilitando la información de depuración, siempre quedará indefinido con este método. Esto está previsto y se puede evitar... bueno, no deshabilitando la información de depuración en $compileProvider - Robba

alternativa a angular.element($0).scope(): también podría hacer $($0).scope() - user2954463

@jaime debería mencionar cómo volver a habilitar la obtención del alcance de un elemento cuando se ha desactivado para el rendimiento. - enorme

Para mejorar la respuesta 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();

O si estás usando jQuery, esto hace lo mismo...

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

Otra forma fácil de acceder a un elemento DOM desde la consola (como mencionó jm) es hacer clic en él en la pestaña 'elementos', y automáticamente se almacena como $0.

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

Respondido 02 Abr '13, 05:04

angular contiene un subconjunto de jquery, por lo que siempre puede usar la sintaxis posterior (si es correcta), no estoy seguro de que lo sea: Pizzaiola Gorgonzola

Terminé con angular.element(document.body).scope(), ¡gracias! - Alex Sorokoletov

Si tienes instalado Batarang

Entonces puedes simplemente escribir:

$scope

cuando tienes el elemento seleccionado en la vista de elementos en cromo. Ref- https://github.com/angular/angularjs-batarang#console

Respondido el 06 de Septiembre de 13 a las 17:09

Esta es una forma de llegar al alcance sin Batarang, puedes hacer:

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

O si desea encontrar su alcance por nombre de controlador, haga esto:

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

Después de realizar cambios en su modelo, deberá aplicar los cambios al DOM llamando:

scope.$apply();

respondido 18 nov., 15:07

¿Cómo es que esta respuesta tiene tantos votos a favor? ¡No necesitas jQuery para esto! angular.element ya es un método de selección de elementos. Deja de decir que necesitas jQuery para tareas simples como seleccionando un elemento por su id! - kyeótico

No dije que lo necesitas. Lo que estoy diciendo es que si ya lo tienes allí, podrías usarlo así. - ValienteNuevoMatemáticas

angular.element ya hace lo que está usando jQuery. De hecho, si jQuery está disponible angular.element es un alias para jQuery. Estás complicando innecesariamente tu código. angular.element('#selectorId') y angular.element('[ng-controller=myController]') hacer lo mismo, solo que con menos código. También podrías llamar angular.element('#selectorId'.toString()) - kyeótico

@Tyrsius, ¿tal vez sus comentarios podrían ser menos acusatorios y enojados y un poco más profesionales? - Tass

@Tass Tienes razón, fui innecesariamente grosero. Me disculpo. Basta decir que se está haciendo dos veces lo mismo. - kyeótico

En algún lugar de su controlador (a menudo, la última línea es un buen lugar), coloque

console.log($scope);

Si desea ver un alcance interno/implícito, digamos dentro de una repetición ng, algo como esto funcionará.

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

Luego en tu controlador

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

Tenga en cuenta que arriba definimos la función showScope() en el ámbito principal, pero está bien... el ámbito secundario/interno/implícito puede acceder a esa función, que luego imprime el ámbito en función del evento y, por lo tanto, el ámbito asociado con el elemento que disparó el evento.

La sugerencia de @ jm- también funciona, pero no creo que funcione dentro de un jsFiddle. Recibo este error en jsFiddle dentro de Chrome:

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

Respondido el 06 de diciembre de 12 a las 22:12

Una advertencia para muchas de estas respuestas: si asigna un alias a su controlador, sus objetos de alcance estarán en un objeto dentro del objeto devuelto desde scope().

Por ejemplo, si su directiva de controlador se crea así: <div ng-controller="FormController as frm"> luego para acceder a un startDate propiedad de su controlador, llamaría angular.element($0).scope().frm.startDate

Respondido 24 Feb 15, 04:02

Regulador is accesible a la vista (por lo tanto, a la consola) como una propiedad de $scope, llamado $ctrl por defecto, independientemente de si le cambias el nombre usando controllerAs O no. no entiendo donde viste "advertencia" en las respuestas existentes. Tenga en cuenta que la mayoría de las respuestas aquí se proporcionaron cuando controllerAs no era una práctica común. - tao

Derecha. Cuando se dieron esas respuestas, controllerAs no era una práctica común, por lo que era confuso para los novatos que pueden haber estado siguiendo un "libro de cocina" que les decía que crearan un alias para el controlador, pero luego no veían las propiedades sin usar el alias. Las cosas iban rápido hace dos años. - Michael Blackburn

Para agregar y mejorar las otras respuestas, en la consola, ingrese $($0) para obtener el elemento. Si se trata de una aplicación Angularjs, se carga una versión jQuery lite de forma predeterminada.

Si no está usando jQuery, puede usar angular.element ($0) como en:

angular.element($0).scope()

Para verificar si tiene jQuery y la versión, ejecute este comando en la consola:

$.fn.jquery

Si ha inspeccionado un elemento, el elemento actualmente seleccionado está disponible a través de la línea de comando API referencia $0. Tanto Firebug como Chrome tienen esta referencia.

Sin embargo, las herramientas de desarrollo de Chrome pondrán a disposición los últimos cinco elementos (u objetos del montón) seleccionados a través de las propiedades denominadas $0, $1, $2, $3, $4 utilizando estas referencias. Se puede hacer referencia al elemento u objeto seleccionado más recientemente como $0, al segundo más reciente como $1 y así sucesivamente.

Aquí está la Referencia de API de línea de comandos para Firebug que enumera sus referencias.

$($0).scope() devolverá el alcance asociado con el elemento. Puedes ver sus propiedades enseguida.

Algunas otras cosas que puedes usar son:

  • Ver el alcance principal de un elemento:

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

  • Puedes encadenar esto también:

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

  • Puedes mirar el alcance de la raíz:

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

  • Si resaltó una directiva con alcance aislado, puede mirarla con:

$($0).isolateScope()

Ver Consejos y trucos para depurar código Angularjs desconocido para obtener más detalles y ejemplos.

Respondido 02 ago 16, 17:08

Estoy de acuerdo en que lo mejor es Batarang con su $scope después de seleccionar un objeto (es lo mismo que angular.element($0).scope() o incluso más corto con jQuery: $($0).scope() (mi favorito))

Además, si como yo tienes tu alcance principal en el body elemento, un $('body').scope() funciona bien.

Respondido el 23 de enero de 14 a las 23:01

Simplemente asigne $scope como una variable global. Problema resuelto.

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

en realidad necesitamos $scope más a menudo en el desarrollo que en la producción.

Ya lo mencionó @JasonGoemaat pero lo agregó como una respuesta adecuada a esta pregunta.

respondido 01 nov., 16:16

Inspeccione el elemento, luego use esto en la consola

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

Respondido el 07 de diciembre de 15 a las 15:12

Primero puede seleccionar un elemento del DOM que esté dentro del alcance que desea inspeccionar:

enter image description here

Luego puede ver el objeto de alcance consultando lo siguiente en la consola:

angular.element($0).scope()

Puede consultar cualquier propiedad en el alcance, por ejemplo:

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

O puede inspeccionar el controlador adjunto al alcance:

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

(Otra opción que puede funcionar es poner un punto de interrupción en su código. Si el $scope se encuentra actualmente en el ámbito actual de 'JavaScript simple y antiguo', entonces puede inspeccionar el valor de $scope en la consola.)

Respondido el 30 de Septiembre de 21 a las 06:09

He usado angular.element($(".ng-scope")).scope(); en el pasado y funciona muy bien. Solo es bueno si solo tiene un alcance de aplicación en la página, o puede hacer algo como:

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

Respondido el 13 de diciembre de 16 a las 21:12

Usualmente uso la función jQuery data() para eso:

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

El $0 es el elemento actualmente seleccionado en el inspector DOM de Chrome. $1, $2.. y así sucesivamente son artículos previamente seleccionados.

Respondido 03 ago 15, 21:08

Digamos que desea acceder al alcance del elemento como

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

Podrías usar lo siguiente en la consola:

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

Esto le dará el alcance en ese elemento.

Respondido 25 Feb 16, 15:02

no necesitamos "document.querySelector" aquí - Stepan Suvórov

En la consola 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

Ejemplo

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

consola de cromo enter image description here

Respondido el 21 de junio de 18 a las 16:06

Esto también requiere la instalación de jQuery, pero funciona perfectamente para un entorno de desarrollo. Examina cada elemento para obtener las instancias de los ámbitos y luego los devuelve etiquetados con los nombres de los controladores. También elimina cualquier propiedad que comience con $, que es lo que angularjs generalmente usa para su configuración.

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;
        }

Respondido el 18 de junio de 19 a las 23:06

en angular obtenemos el elemento jquery por angular.element().... vamos a c...

angular.element().scope();

ejemplo:

<div id=""></div>

Respondido el 12 de diciembre de 17 a las 09:12

Solo con fines de depuración, puse esto al inicio del controlador.

   window.scope = $scope;

  $scope.today = new Date();

Y así es como lo uso.

enter image description here

luego elimínelo cuando termine de depurar.

respondido 08 mar '19, 17:03

Simplemente defina una variable de JavaScript fuera del alcance y asígnela a su alcance en su controlador:

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

¡Eso es todo! Debería funcionar en todos los navegadores (probado al menos en Chrome y Mozilla).

Está funcionando, y estoy usando este método.

respondido 09 mar '19, 11:03

Usar variables globales es una mala práctica, pero supongo que está bien en la mayoría de los casos. Es solo para depurar después de todo; Pero aún debe tener cuidado de no usar el mismo nombre de variable dos veces. - pedro afonso

Es una mala idea porque requiere que modifiques el código fuente. Esto es molesto incluso si es su propio código e imposible si es algo que se ejecuta en otro servidor. Incluso si puede modificar el código, debe recordar deshacerlo. Entonces, si bien puede funcionar, no es la mejor práctica. - Jim Davis

@JimDavis En general, estoy de acuerdo, pero hay casos en los que hacer esto es útil: al modificar temporalmente las fuentes, puede dejar que el código haga las cosas que tendría que hacer manualmente una y otra vez. Entonces, cuando el problema se siente complicado y la depuración tomará mucho tiempo, modifico el código. Deshacer los cambios es trivial con la herramienta adecuada (git). - maaartinus

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.