2012-09-27 28 views
6

¿Cómo prevenir directivas con transclude para crear nuevos ámbitos?directiva AngularJS transclude scope = false?

Esto jsfiddle No puedo enlazar nada debido a los nuevos ámbitos ilustrados con bordes rojos.

HTML:

<div ng-app="components"> 
    <input ng-model="var"> 
    <block> 
     123 
     <input ng-model="var"> 
    </block> 
</div> 

JavaScript:

angular.module('components', []).directive('block',function(){ 
    return{ 
     scope:false, 
     replace:true, 
     restrict:"E", 
     transclude:true, 
     template:'<div class="block" ng-transclude></div>', 
     link:function(scope, el, attrs, ctrl){ 

     } 
    } 
}); 

CSS:

.ng-scope{ 
    border:1px solid red; 
    margin:10px; 
} 

Respuesta

6

Se espera que en realidad behav ior como se ha dicho aquí (ng-transcluirla crear un ámbito secundario): https://github.com/angular/angular.js/issues/1056 y discuten aquí: https://groups.google.com/forum/#!msg/angular/45jNmQucSCE/hL8x48-JfZIJ

Puede solucionar esto mediante el establecimiento de un miembro de un objeto en el campo de aplicación (obj.var) como en este violín: http://jsfiddle.net/rdarder/pnSNj/10/

+0

Gracias. Hice un ejemplo más simple [jsfiddle] (http://jsfiddle.net/RHLzK/5/). ¿Pero es eso un error o es una característica? – Jossi

+0

Es un comportamiento normal para ámbitos secundarios (heredan por prototipo del ámbito principal, lo que significa que puede leer desde el ámbito principal, pero tan pronto como escribe, está en el ámbito secundario, a menos que use el obj en el ámbito principal workaroud), quizás podría echarle un vistazo al código fuente de la directiva ng-transclude, copiarlo y crear el suyo con una opción scope: false. – Guillaume86

+0

Los problemas aparecen nuevamente si empiezo a usar transclude set como 'element'. ¿Alguien tiene alguna idea de por qué no funciona ahora? Demostración: http://plnkr.co/edit/Bv1kFQtzdVzsasHTUrgf?p=preview –

0

Aunque esto no es recomendable por el equipo angular, otra solución es llamar explícitamente el alcance $ matriz dentro de la porción transcluye:

<div ng-app="components"> 
    <input ng-model="var"> 
    <block> 
     123 
     <input ng-model="$parent.var"> 
    </block> 
</div> 
Cuestiones relacionadas