如何找到Batarang中可见的AngularJS范围来自哪里?

时间:2013-11-07 20:01:08

标签: angularjs angularjs-scope

我在Batarang查看我的角度应用,其中一个示波器有一些我不认识的值。如何找出创建该范围的内容?

我已经尝试在DOM中搜索类ng-scope。如果有人有兴趣,这就是我提出的解决方案。该函数接受Batarang中显示的范围ID。

function getElementByScopeId(scopeId) {
    var i;
    var scopesInDom = angular.element('.ng-scope');
    for (i=0; i < scopesInDom.length; i++) {
        if (angular.element(scopesInDom[i]).scope().$id === scopeId) {
            return scopesInDom[i];
        }
    }
};

这适用于我在Batarang看到的大多数示波器,但找不到我正在寻找的那个。我认为这是因为它在某些时候被从DOM中删除了。有没有其他方法可以找到范围的来源?

编辑:找到它。但这只是因为我的应用程序中的代码非常少,我并不熟悉。这是我所包含的一个模块,是我没写过的少数几件之一。上面的函数无法找到它的原因是因为它从未在DOM上。它是使用$ rootScope.new(true)创建的;在工厂里面。所以问题仍然存在。有没有办法让我从Batarang中可用的信息中找到以这种方式创建的范围的代码?

1 个答案:

答案 0 :(得分:2)

这是我能来的最好的。

首先(如问题所示)检查你的范围是否在dom上。指令创建的大多数范围都可以通过这种方式找到。

在浏览器控制台中输入:

function getElementByScopeId(scopeId) {
    var i;
    var scopesInDom = angular.element('.ng-scope');
    for (i=0; i < scopesInDom.length; i++) {
        if (angular.element(scopesInDom[i]).scope().$id === scopeId) {
            return scopesInDom[i];
        }
    }
};

然后,例如,如果您要查找的范围ID是005,则可以从控制台运行getElementByScopeId('005'),它将返回创建范围的DOM元素。

如果无法以这种方式找到范围,或者这不足以让您识别范围,则可以在范围创建上执行堆栈跟踪。这将要求您使用未经授权的来源。可能需要这样做的一个示例是服务是否使用$rootScope.new(true);之类的内容创建范围来创建范围。

在Scope。$ new函数返回之前放置一个断点或console.trace()。在最近的稳定版本中,编写AngularJS v1.2.2时的第1111行。对于较旧的稳定分支AngularJS v1.0.8第790行。如果您的范围ID是一致的,您可以将其作为条件断点或将跟踪包装在if中声明。如果您无法预测范围ID,或者您只想查看所有范围,那么如果您正在使用断点,则需要注意child.$id的值,如果使用console.trace(),则需要注意消息所以console.trace('new scope created: ' + child.$id)通过使用这些方法之一检查堆栈跟踪,您应该能够确定创建范围的位置。