trustashtml escape angularjs angularjs-directive angularjs-scope

angularjs - escape - ng-bind-html-unsafe



Directiva de contenido interno con ámbitos aislados y no aislados. (3)

Encontré un comportamiento de alcance bastante extraño : tipo verdadero para el contenido interno de una directiva:

<body ng-init="x=10"> <mydir> {{x}} </mydir> </body>

entonces {{x}} es contenido interno, y la definición de la directiva es:

.directive(''mydir'', function() { return { scope: {}, link: function(scope){ scope.x = 5; } }; });

Cuando definimos el alcance como aislado ( alcance: {} ), genera {{x}} como 10, por lo que utiliza el alcance externo. Pero cuando creamos un nuevo ámbito para la directiva ( scope: true ), la usará para contenido interno y salida 5. Por lo tanto, utiliza diferentes ámbitos para contenido interno para 2 casos. ¿Alguien podría darme una sugerencia / enlace para obtener el código / manual para la explicación de esta inconsistencia?

Aquí está plnk para jugar con el código.

UPD : Entiendo lo que es la herencia del prototipo de JavaScript. Conozco la diferencia entre los tipos de ámbito directivo. Y mi objetivo no es mostrar 5 en lugar de 10. La pregunta es acerca de la plantilla interna que, en ambos casos, debe interpolarse con el alcance principal, que no tiene acceso a las propiedades del secundario / aislado.


A obtuve la respuesta de los problemas angulares: github.com/angular/angular.js/issues/…

Y aquí está la respuesta del código fuente: https://github.com/angular/angular.js/blob/eae0a1121ffcc636d760463105dcdc548ea47390/src/ng/compile.js#L2538-L2545

var scopeToChild = scope; if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { scopeToChild = isolateScope; } childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);

curriculum vitae: en el caso de un tipo de ámbito aislado, el ámbito se proporciona SOLAMENTE para la plantilla de directiva , pero no para el contenido interno.


Algo que no está bien está sucediendo. Si ejecuta su código en Chrome con Batarang activado, puede ver cuando alcance: {} que efectivamente está creando un nuevo alcance separado del primero, completamente desconectado, y configurando la variable a 5. Pero su cadena interpolada está enlazando alcance exterior Si establece el ámbito: verdadero , también se crea un nuevo ámbito heredado del exterior, y la interpolación {{x}} se vincula correctamente. No creo que sea el parámetro de alcance de la directiva que no funciona, algo con el enlace no funciona.


En su fragmento de código original, el {{x}} no pertenece a <mydir> . Debe definir una plantilla a la directiva.

// js .directive(''mydir'', function() { return { template: ''{{x}}'', scope: {}, link: function(scope){ scope.x = 5; } }; }); // html <body ng-init="x=10"> <mydir></mydir> </body>

Aquí está la vista previa