link body attribute javascript angularjs angularjs-scope

javascript - body - meta html



¿Cómo verificar si el alcance está aislado? (3)

¿Es de alguna manera posible verificar si el alcance angular está aislado o no, teniendo solo el alcance?

Sé que los ámbitos aislados y no aislados tienen diferentes prototipos. Sin embargo, estos prototipos son privados en angular y no se puede acceder fácilmente. Verificar el nombre del prototipo parece un enfoque bastante sucio.

¿Alguna mejor idea?


La primera diferencia que sé es que ese ámbito aislado tiene el campo "$ raíz", que es rootScope .

La segunda diferencia es que ese ámbito aislado tiene el campo "$$ aislar Vinculaciones", pero no aislado no tiene


Puedes verificarlo así:

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

No es perfecto ya que depende de los detalles de implementación, pero no puedo pensar en nada mejor que esto.

Explicación:

  1. scope.hasOwnProperty(''$root'') . Cada alcance tiene esta propiedad. Apunta al alcance ancestro más cercano que está aislado o $rootScope . Esta propiedad se hereda de forma prototípica, por lo que es solo para ámbitos $rootScope y $rootScope .

  2. scope.$root !== scope . Verificando que el alcance no sea $rootScope .

  3. scope.$root . Se puede reemplazar con !scope.$$destroyed . Cuando se destruye un ámbito, se asigna null a muchas de sus propiedades, incluida $root , por lo que la propiedad se convierte en propiedad.


Según la documentación, lo siguiente debería ser el truco:

$element.isolateScope()

recupera un alcance aislado si uno está conectado directamente al elemento actual. Este captador debe usarse solo en elementos que contengan una directiva que comience un nuevo alcance aislado. Calling scope () en este elemento siempre devuelve el alcance original no aislado. Requiere datos de depuración para ser habilitado.

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

Como se menciona en los documentos, si configura lo siguiente (como debería en producción):

$compileProvider.debugInfoEnabled(false);

Este método ya no funcionará ... Supongo que la razón principal para obtener el isolateScope esta manera es para pruebas unitarias y no hay realmente una razón para realizar condicionalmente alguna acción sobre el aislamiento del alcance (corríjame si estoy equivocado).

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