2

我正在查看我在Batarang的 Angular 应用程序,其中一个范围有一些我不认识的值。如何找出创建该范围的原因?

我已经尝试在 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 中可用的信息中找到以这种方式创建的范围的代码?

4

1 回答 1

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 的最新稳定版本中,这是第 11119 行。对于较旧的稳定分支 AngularJS v1.0.8 第 7903 行。如果您的范围 id 是一致的,您可以将其设置为条件断点或将跟踪包装在 if陈述。如果您无法预测范围 id,或者您只想查看所有范围,child.$id如果您正在使用断点,您将需要使用 watch 记录值,或者如果使用 console.trace() 则显示消息,例如console.trace('new scope created: ' + child.$id)通过检查堆栈使用这些方法中的任何一种进行跟踪,您应该能够确定该范围的创建位置。

于 2013-11-24T14:51:40.993 回答