如何使用AngularJS访问浏览器控制台中的$ scope变量?
我想在Chrome的JavaScript控制台中访问我的$scope
变量。 我怎么做?
我不能在控制台中看到$scope
或模块myapp
的名称作为变量。
在开发人员工具的HTML面板中选择一个元素,然后在控制台中输入:
angular.element($0).scope()
在WebKit和Firefox中, $0
是元素选项卡中所选DOM节点的引用,所以通过这样做,可以在控制台中打印出所选的DOM节点范围。
您也可以通过元素ID来定位范围,如下所示:
angular.element(document.getElementById('yourElementId')).scope()
插件/扩展
您可能想要查看一些非常有用的Chrome扩展程序:
-
巴塔朗 。 这已经有一段时间了。
-
ng-inspector 。 这是最新的,顾名思义,它允许你检查你的应用程序的范围。
玩jsFiddle
使用jsfiddle时,您可以在显示模式下通过在URL末尾添加/show
来打开小提琴。 像这样运行时,您可以访问angular
全局。 你可以在这里尝试:
http://jsfiddle.net/jaimem/Yatbt/show
jQuery精简版
如果你在AngularJS之前加载jQuery, 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/
为了改善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();
如果你已经安装了Batarang
那么你可以写:
$scope
当你在chrome中的元素视图中选择元素。 参考 – https://github.com/angular/angularjs-batarang#console
放在你的控制器的某个地方(通常最后一行是个好地方)
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里面工作。 我在Chrome中的jsFiddle上得到这个错误:
> angular.element($0).scope() ReferenceError: angular is not defined
这是在没有Batarang的情况下获得范围的一种方法,您可以这样做:
var scope = angular.element('#selectorId').scope();
或者,如果您想通过控制器名称查找范围,请执行以下操作:
var scope = angular.element('[ng-controller=myController]').scope();
在对模型进行更改之后,您需要通过调用以下方法将更改应用于DOM:
scope.$apply();
一个告诫,许多这些答案:如果你别名你的控制器你的范围对象将在scope()
返回的对象中的对象。
例如,如果您的控制器指令是这样创建的: <div ng-controller="FormController as frm">
然后访问控制器的startDate
属性,您可以调用angular.element($0).scope().frm.startDate
我同意最好的选择一个对象(它是相同的angular.element($0).scope()
或更短的jQuery: $($0).scope()
(我的最爱)是它的$scope
$($0).scope()
)
另外,如果像我一样,你有主体作用于body
元素, $('body').scope()
可以正常工作。
只要把$scope
作为一个全局变量。 问题解决了。
app.controller('myCtrl', ['$scope', '$http', function($scope, $http) { window.$scope = $scope; }
我们在开发中实际上比生产中更需要$scope
。
@JasonGoemaat已经提到了这个问题,但是把它作为这个问题的一个合适的答案。
我通常使用jQuery data()函数:
$($0).data().$scope
$ 0是当前在Chrome DOM检查器中选定的项目。 $ 1,$ 2 ..等都是之前选定的项目。
检查元素,然后在控制台中使用它
s = $($0).scope() // `s` is the scope object if it exists
要添加和增强其他答案,请在控制台中输入$($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等等。
这是Firebug的命令行API参考 ,列出了它的参考。
$($0).scope()
将返回与该元素关联的范围。 你可以马上看到它的属性。
其他一些你可以使用的东西是:
- 查看元素父范围:
$($0).scope().$parent
。
- 你也可以链接:
$($0).scope().$parent.$parent
- 你可以看看根范围:
$($0).scope().$root
- 如果您突出显示隔离范围的指令,则可以使用以下方法查看:
$($0).isolateScope()
有关更多详细信息和示例,请参阅调试不熟悉的Angularjs代码的提示和技巧 。
我已经使用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();
这会给你在这个元素的范围。
将代码中的断点放在接近对$ scope变量的引用的位置(这样$ scope就在当前的“普通旧JavaScript”范围内)。 然后你可以检查控制台中的$ scope值。
只需在范围外定义一个JavaScript变量,并将其分配给控制器中的范围:
var myScope; ... app.controller('myController', function ($scope,log) { myScope = $scope; ...
而已! 它应该在所有的浏览器中工作(至少在Chrome和Mozilla中测试过)。
它正在工作,我正在使用这种方法。