如何检查范围是否隔离?

时间:2016-04-29 14:23:33

标签: javascript angularjs angularjs-scope

以某种方式可以检查角度范围是否被隔离,仅具有范围?

我知道,孤立且不孤立的范围有不同的原型。然而,这些原型是有角度的私人,不容易访问。检查原型名称似乎很脏。

有更好的主意吗?

3 个答案:

答案 0 :(得分:2)

我知道的第一个区别是,隔离范围有“$ root”字段,即rootScope

第二个区别是,隔离范围具有“$$ isolateBindings”字段,但未隔离没有

答案 1 :(得分:1)

根据文档,以下内容应该可以解决问题:

$element.isolateScope()
  

如果一个直接连接到当前,则检索隔离范围   元件。此getter应仅用于包含a的元素   启动新隔离范围的指令。在此调用scope()   element始终返回原始的非隔离范围。需要调试   要启用的数据。

https://docs.angularjs.org/api/ng/function/angular.element#jquery-jqlite-extras

如文档中所述,如果您配置以下内容(正如您应该在生产中那样):

$compileProvider.debugInfoEnabled(false);

这个方法将不再起作用......我认为以这种方式获得isolateScope的主要原因是单元测试,并且没有理由在范围隔离上有条件地执行某些操作(如果我错了,请纠正我。

https://jsfiddle.net/r0m4n/f84yzdt4/

答案 2 :(得分:0)

您可以这样检查:

if (scope.hasOwnProperty('$root') && scope.$root !== scope && scope.$root) {
    // the scope is isolate
}

它并不完美,因为它依赖于实现细节,但我想不出比这更好的东西。

说明:

  1. scope.hasOwnProperty('$root')。每个范围都有此属性。它指向最近的孤立或$rootScope的祖先范围。此属性是原型继承的,因此它仅用于隔离范围和$rootScope 拥有

  2. scope.$root !== scope。检查范围不是$rootScope

  3. scope.$root。可以用!scope.$$destroyed替换。当范围被销毁时,null被分配给其许多属性,包括$root,因此该属性变为拥有。