Tengo una directiva con un alcance aislado (para poder reutilizar la directiva en otros lugares), y cuando uso esta directiva con un ng-repeat
, no funciona.
He leído toda la documentación y las respuestas de Stack Overflow sobre este tema y entiendo los problemas. Creo que he evitado todas las trampas habituales.
Entonces entiendo que mi código falla debido al alcance creado por la ng-repeat
directiva. Mi propia directiva crea un alcance aislado y realiza un enlace de datos bidireccional a un objeto en el alcance principal. Mi directiva asignará un nuevo valor de objeto a esta variable vinculada y esto funciona perfectamente cuando mi directiva se usa sin ng-repeat
(la variable principal se actualiza correctamente). Sin embargo, con ng-repeat
, la asignación crea una nueva variable en el ng-repeat
alcance y la variable principal no ve el cambio. Todo esto es el esperado según lo que he leído.
También he leído que cuando hay varias directivas en un elemento determinado, solo se crea un ámbito. Y que priority
se puede establecer un en cada directiva para definir el orden en que se aplican las directivas; las directivas se ordenan por prioridad y luego se llaman a sus funciones de compilación (busque la palabra prioridad en http://docs.angularjs.org/guide/directive ).
Así que esperaba poder usar la prioridad para asegurarme de que mi directiva se ejecute primero y termine creando un alcance aislado, y cuando se ng-repeat
ejecute, reutilice el alcance aislado en lugar de crear un alcance que herede prototípicamente del alcance principal. La ng-repeat
documentación indica que esa directiva se ejecuta a nivel de prioridad 1000
. No está claro si 1
es un nivel de prioridad más alto o un nivel de prioridad más bajo. Cuando usé el nivel de prioridad 1
en mi directiva, no hizo ninguna diferencia, así que lo intenté 2000
. Pero eso empeora las cosas: mis enlaces bidireccionales se vuelven undefined
y mi directiva no muestra nada.
He creado un violín para mostrar mi problema . He comentado la priority
configuración en mi directiva. Tengo una lista de objetos de nombre y una directiva llamada name-row
que muestra los campos de nombre y apellido en el objeto de nombre. Cuando se hace clic en un nombre mostrado, quiero que establezca una selected
variable en el ámbito principal. La matriz de nombres y la selected
variable se pasan a la name-row
directiva mediante enlace de datos bidireccional.
Sé cómo hacer que esto funcione llamando a funciones en el alcance principal. También sé que si selected
está dentro de otro objeto y me ato al objeto exterior, las cosas funcionarían. Pero no estoy interesado en esas soluciones en este momento.
En cambio, las preguntas que tengo son:
- ¿Cómo evito
ng-repeat
crear un alcance que hereda prototípicamente del alcance principal y, en su lugar, haga que use el alcance aislado de mi directiva? - ¿Por qué
2000
no funciona el nivel de prioridad en mi directiva? - Usando Batarang, ¿es posible saber qué tipo de visor está en uso?
ng-repeat
. Creo que es valioso poder combinar directivas independientes con ng-repeat
. Continuará ...
ng-repeat
no debería tener un alcance. ng-repeat
tener un alcance tiene sentido para el caso de uso típico, por lo que no estoy sugiriendo que se cambie. En cambio, como comenté en la respuesta de Alex Osborn, creo que crearé una directiva de repetición basada en ng-repeat
que no crea su propio alcance. Esto se puede utilizar para repetir directivas que tienen sus propios ámbitos de aislamiento. Continuará ...
ng-repeat
o la directiva de repetición personalizada sin alcance. Creo que está bien que la "persona que llama" sepa esto, pero no está bien que una "persona que llama" (la directiva se repite) sepa si se está repitiendo o no. Continuará ...
scope: true
para su directiva. Consulte también (si aún no lo ha hecho) stackoverflow.com/questions/14914213/… Además, el hecho de que una directiva se use en varios lugares no significa que debamos usar automáticamente un alcance aislado.