有没有办法在禁用调试信息时获取DOM元素的范围?

Bob*_*uan 9 angularjs

我正在编写一个需要检索当前DOM元素范围的指令.使用非公共APIangular.element().scope();

它工作得很好,直到angular 1.3引入了一个新功能$compileProvider.debugInfoEnabled(false);,主要目的是提高性能,以避免DOM元素中的绑定数据.但是当debugInfoEnabled()设置为false时,angular.element().scope()将返回undefined.所以我必须找到另一种获取DOM元素范围的方法,或者我必须重新设计我的代码逻辑.

有没有办法让这成为可能?

小智 11

在编译我们的应用程序后,我在应用程序中遇到了类似的问题$compileProvider.debugInfoEnabled(false);.我需要稍后访问我们的一些指令的隔离范围但不能使用该isolateScope()方法.为了解决这个问题,我在Utils服务中创建了一个辅助函数,如下所示:

this.setElementIsolateScope = function(element, scope) {
    element[0].isolateScope = function() {
        return scope;
    };
};
Run Code Online (Sandbox Code Playgroud)

然后在我需要能够以后访问隔离范围的任何指令中,我在函数内部调用了这个link()函数:由于element是一个jqLit​​e对象,你需要设置isolateScope()函数element[0].您应该已经将jqLit​​e包装elementscope已经传递到您的链接功能,然后您只需将其传递给您的服务方法.

Utils.setElementIsolateScope(element, scope);
Run Code Online (Sandbox Code Playgroud)

然后,为了访问隔离范围,您将获得对元素的引用,然后执行此操作(假设child_element是对元素/指令的引用):

var child_iso_scope = _.isFunction(child_element.isolateScope) && child_element.isolateScope();
Run Code Online (Sandbox Code Playgroud)

根据您获取元素引用的方式,您可能需要将它包装为jqLit​​e包装器,如下所示:

child_element = angular.element(child_element);
Run Code Online (Sandbox Code Playgroud)

然后使用与上面相同的方法来获得隔离范围.希望这可以帮助!