如何使用angularjs访问浏览器控制台中的$scope变量?

How do I access the $scope variable in browser's console using AngularJS?

我想在chrome的javascript控制台中访问我的$scope变量。我该怎么做?

我在控制台中既看不到$scope也看不到我的模块myapp的名称作为变量。


在开发人员工具的HTML面板中选择一个元素,然后在控制台中键入:

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

在webkit和firefox中,$0是对"元素"选项卡中选定的DOM节点的引用,因此,通过执行此操作,可以在控制台中打印出选定的DOM节点范围。

您还可以按元素ID确定作用域的目标,例如:

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

附加组件/扩展

有一些非常有用的chrome扩展,您可能需要查看:

  • 巴塔让。这已经存在一段时间了。

  • 检查员。这是最新的一个,顾名思义,它允许您检查应用程序的作用域。

玩J小提琴

使用jsFiddle时,您可以通过在URL末尾添加/show,以显示模式打开fiddle。这样运行时,您可以访问angularglobal。您可以在这里尝试:

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

jQuery简化

如果在angularJS之前加载jquery,则可以向angular.element传递jquery选择器。所以你可以用

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

一个按钮

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

…等等。

实际上,您可能希望使用全局函数使其更简单:

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

现在你可以这么做了

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

请访问:http://jsfiddle.net/jaimem/dvra/1/show/


为了改进JM的答案…

1
2
3
4
5
6
7
8
9
// 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,这会做同样的事情…

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

从控制台访问DOM元素的另一个简单方法(如jm所提到的)是在"元素"选项卡中单击它,它将自动存储为$0

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


如果你已经安装了巴塔朗

然后你就可以写:

1
$scope

当您在Chrome的元素视图中选择元素时。参考-https://github.com/angularjs-batarang console


这是一种不使用巴塔朗的方法,你可以这样做:

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

或者,如果要按控制器名称查找作用域,请执行以下操作:

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

对模型进行更改后,需要通过调用以下命令将更改应用于DOM:

1
scope.$apply();


在控制器的某个地方(通常最后一行是个好地方),放

1
console.log($scope);

如果您希望看到一个内部/隐式范围,比如说在一个NG重复中,这样的事情会起作用。

1
2
3
4
5
<li ng-repeat="item in items">
   ...
   show scope

</li>

然后在你的控制器里

1
2
3
4
5
6
function MyCtrl($scope) {
    ...
    $scope.showScope = function(e) {
        console.log(angular.element(e.srcElement).scope());
    }
}

注意上面我们在父作用域中定义了showscope()函数,但是这没关系…子/内部/隐式作用域可以访问该函数,然后根据事件打印出作用域,从而打印出与触发事件的元素关联的作用域。

@JM-的建议也有效,但我认为它在JSfiddle中不起作用。我在Chrome内部的jsFiddle上得到这个错误:

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


对于这些答案中的许多,有一个警告:如果您将控制器别名,那么作用域对象将位于从scope()返回的对象内的一个对象中。

例如,如果您的控制器指令是这样创建的:然后,要访问控制器的startDate属性,您可以调用angular.element($0).scope().frm.startDate


我同意在选择一个对象(与angular.element($0).scope()相同或jquery更短:$($0).scope()是我最喜欢的)后,最好是batarang和它的$scope

另外,如果像我一样,您在body元素上有主作用域,那么$('body').scope()可以正常工作。


我以前用过angular.element($(".ng-scope")).scope();,效果很好。只有当你在页面上只有一个应用程序范围,或者你可以做如下的事情时才是好的:

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


只需将$scope指定为全局变量即可。问题解决了。

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

实际上,我们在开发中比在生产中更需要$scope

已经被@jasongoemat提到了,但是添加它作为这个问题的合适答案。


要添加和增强其他答案,请在控制台中输入$($0)以获取元素。如果是AngularJS应用程序,则默认情况下会加载jQueryLite版本。

如果不使用jquery,可以使用angular.element($0),如下所示:

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

要检查是否有jquery和版本,请在控制台中运行此命令:

1
$.fn.jquery

如果您检查了一个元素,那么当前选择的元素可以通过命令行api引用$0获得。Firebug和Chrome都有这个参考。

但是,chrome开发人员工具将使用这些引用使通过名为$0、$1、$2、$3、$4的属性选择的最后五个元素(或堆对象)可用。最近选择的元素或对象可以引用为$0,第二个最新的元素或对象可以引用为$1,依此类推。

下面是firebug的命令行API引用,列出了它的引用。

$($0).scope()将返回与元素关联的作用域。你可以马上看到它的属性。

您还可以使用其他一些功能:

  • 查看元素父范围:

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

  • 你也可以链接这个:

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

  • 您可以查看根作用域:

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

  • 如果用isolate scope突出显示了一个指令,则可以使用以下命令查看它:

$($0).isolateScope()

有关更多详细信息和示例,请参阅调试不熟悉的AngularJS代码的提示和技巧。


检查元件,然后在控制台中使用。

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


我通常使用jquery data()函数:

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

$0当前是chrome dom inspector中的选定项。1美元,2美元…等等是以前选择的项目。


假设您想访问元素的作用域,比如

1
 

您可以在控制台中使用以下内容:

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

这将为您提供该元素的作用域。


为了调试的目的,我把这个放到控制器的开头。

1
2
3
   window.scope = $scope;

  $scope.today = new Date();

我就是这样使用它的。

enter image description here

然后在调试完成后删除它。


在代码中靠近$scope变量引用的某个地方放置一个断点(这样$scope就在当前的'plain old javascript'范围内)。然后您可以在控制台中检查$scope值。


在angular中,我们通过angular.element()得到jquery元素…让C…

angular.element().scope();

例子:


在Chrome的控制台上:

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

例子

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

铬合金控制台enter image description here


只需在作用域之外定义一个javascript变量并将其分配给控制器中的作用域:

1
2
3
4
5
var myScope;
...
app.controller('myController', function ($scope,log) {
     myScope = $scope;
     ...

就是这样!它应该可以在所有浏览器中工作(至少在Chrome和Mozilla中测试过)。

它正在工作,我正在使用这个方法。