Angular.js: angular.element.scope() 返回未定义

创建于 2014-10-09  ·  29评论  ·  资料来源: angular/angular.js

通过更改 iframe src 属性将应用程序加载到 iframe 中时,angular.element.scope() 未定义。

以下代码应返回对作用域的引用,但返回未定义:

angular.element(document.body).scope()

在加载文档并且 angular 完成引导后,上面的代码在 onclick 处理程序中执行:

<script>
    document.addEventListener("click", function(){
        console.log(angular.element(document.body).scope());
    });
</script>

只有在通过修改其 src 属性将文档加载到 iframe 中时,才会出现此问题。
用 1.3.0-rc.5 测试,没有 jquery。

jqLite more info

最有用的评论

如果你想暂时启用调试信息(例如,用于在现场制作应用程序调试的问题),你可以使用angular.reloadWithDebugInfo()所描述这里

所有29条评论

您能否提供该问题的 plnkr 再现?

我在自己的项目中遇到了同样的问题,但无法使用 plnkr 重现它。

scope() 在任何元素上返回 undefined 。

使用 JQLite 或 JQuery 2.1.1 做同样的事情。

AngularJS 1.3.1。

尝试这个:

document.addEventListener('DOMContentLoaded', function () {
  angular.element(document.body).scope();
});

你在你的项目@VictorQueiroz 中禁用调试信息吗?

@caitp你找到了。

启用调试信息返回是解决此问题的好方法。

一个很好的解决方法

:smile: :smile: :smile:

抱歉大家暂时没有反应。 这个问题在某种程度上与 jqCache 相关,或者更具体地说与创建 expandoId 的方式有关。 在较旧的 RC 中,id 是这样创建的:
var expandoId = element[JQLite.expando];
在较新的版本中,id 是使用硬编码属性获取的:
var expandoId = element.ng339;
恢复更改解决了问题。
不幸的是,我对这些东西了解不多,所以如果有人可以阐明功能,那么也许我可以更详细地描述这个问题。

哦,哇,谢谢@caitp把我逼疯了!
$compileProvider的文档中应该有一个注释,说明$compileProvider.debugInfoEnabled(false)将使scope()函数返回未定义,如果这是预期的行为。

编辑:我的错,它已经在文档中了

调用此方法以启用/禁用编译器中的各种调试运行时信息,例如向 DOM 元素添加绑定信息和对当前作用域的引用。

有没有解决的办法; 有 debugInfoEnabled(false),但仍然能够访问元素的范围?

如果你想暂时启用调试信息(例如,用于在现场制作应用程序调试的问题),你可以使用angular.reloadWithDebugInfo()所描述这里

我认为@gkalpak在这里澄清了一些事情!

为什么关门? 找到解决方法并不意味着问题已解决,无论调试模式如何,scope() 都应返回附加的作用域。

如果不可能,应该在angular.element #scope() 文档中

@Toilal我已经关闭它,因为它已经记录在该线程的先前评论中。 但是,如果您认为它应该在其他地方记录以及 PR 将不胜感激!

我不能,因为我不确定 angular.element 中的女巫方法在禁用调试时不起作用。 scope() 是肯定的,因为我已经尝试过了,但是其他的呢,比如 controller()、injector() ...

经过测试,它只影响scope()和isolateScope()。 我会记录这些并制作 PR。

但是有没有办法在禁用调试信息的同时从 DOM 元素中检索范围?

@Toilal - 不是真的 - 范围信息被删除,因为它暴露了性能影响 - 这就是它隐藏在调试标志后面的原因。

但是编写一个可以做到这一点的指令并将其放在您需要检查的元素上并不难

感谢@pkozlowski-opensource。 我在文档中添加了一个关于 scope() 和isolateScope() 的小句子,因为我需要花一些时间才能弄清楚为什么这些方法在我的应用程序中不起作用。

@ocombe这就是我要做的,因为我正在编写 UI 组件并且不能依赖 scope/isolateScope,因为最终开发人员可以禁用调试信息(如推荐)。

设置超时(函数(){
console.log(angular.element(document.body).scope());
}, 100);

qq 20160115164505

@ronnievdv

有没有解决的办法; 有 debugInfoEnabled(false),但仍然能够访问元素的范围?

我在指令定义的link函数中使用了以下 snipet _(不推荐)_ 方法。

link: function(scope, element, attrs) {
  var isolatedScope = scope.$$childTail;
}

有没有办法检查 debugInfo 是否已被禁用或任何标志?

在应用程序中,您可以使用$compileProvider.debugInfoEnabled()
如果您想调试禁用了调试信息的实时实例(例如生产部署),您可以从控制台调用angular.reloadWithDebugInfo() ,它会重新加载启用调试信息的应用程序。

@gkalpak我只想检查是否启用了调试信息。 有点像这样。

if(angular.isDebugInfoEnabled()) {
  // Do something
}

@hemkaran ,你想从
如果确实如此,您可以使用$compileProvider.debugInfoEnabled()

@Toilal你写过这样的指令吗? 如果是这样,你介意分享吗? 我现在有这个问题。 我想我会找到一个解决方案,但对如何解决它有第二个意见真的不会有什么坏处。
抄送@ocombe

抱歉,我不再使用 Angular 1,而且我从未编写过这样的指令(因为我只在开发模式下需要此信息)

我做了以下事情。 我们会看看我的队友是否会让它通过审查:)

function exposeScope() {
    return {
        restrict: 'A',
        link: function(scope, element) {
            element[0].APPNAME = {
                getScope: function() {
                    return scope;
                }
            };
        }
    };
}

return {
        restrict: 'A',
        scope: false,
        link: function(scope, elem) {
            elem.data('$scope', scope);
        }
    };

如果需要,您也可以将 $isolateScope 设置为相同。

此页面是否有帮助?
0 / 5 - 0 等级