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