2012-08-17 4 views
5

Así que acabo de empezar a usar AngularJS, y parece perfectamente bien hasta ahora, aparte de un pequeño inconveniente. Digamos que tengo dos directivas, una de las cuales requiere la otra, así:AngularJS: templateUrl aplaza la construcción de controlador, código dependiente se rompe

angular.module('components', []) 
    .directive('outer', function() { 
     return { 
      restrict: 'E', 
      replace: true, 
      transclude: true, 
      scope: {}, 
      link: function(scope) { ... }, 
      controller: function($scope) { ... }, 
      templateUrl: 'outer.html' // Note this 
     }; 
    }) 
    .directive('inner', function() { 
     return { 
      require: '^outer', // And this 
      restrict: 'E', 
      ... 
      link: function(scope, element, attrs, outerCtrl) { ... }, 
      templateUrl: 'inner.html' 
     }; 
    }); 

utiliza en el algo HTML así:

<outer> 
    <inner></inner> 
</outer> 

Si outer.html las cargas antes inner.html, entonces no hay problema en absoluto.<outer> se transforma correctamente y se le asigna un alcance y un controlador, y <inner> recibe ese controlador muy bien.

Si la carga plantillas en el orden opuesto, sin embargo, <inner> está vinculado antes se ha creado <outer> ‘s controlador, y falla con el mensaje de error‘Error: no controlador: exterior’.

He intentado adjuntar un retraso de carga del lado del servidor a inner.html, y mientras se carga primero outer.html, no hay ningún problema en absoluto. De forma similar, si inserto la plantilla de outer (es decir, usando template en lugar de templateUrl), esa plantilla estará disponible primero y todo funciona de manera espléndida.

¿Alguien sabe de alguna manera de usar templateUrl en directivas que son requeridas por otras directivas? En mi código actual, es vital que la directiva interna tenga acceso al controlador externo, y prefiero templateUrl sobre template porque el primero separa el diseño del comportamiento, y hace que sea mucho más fácil configurar las plantillas incluso después del comportamiento el código ha crecido grande.

Gracias de antemano, y lo siento si esto ya se ha pedido antes; No pude encontrar ninguna pregunta equivalente en Stack Overflow.

Respuesta

2

Cuando define directivas múltiples dentro de un mismo módulo, puede asignar una prioridad que cumpla con el orden en el que se deben ejecutar las directivas. En tu caso, dale a 'lo externo' más prioridad que a lo interno. Por lo tanto, independientemente de cuándo se carga la plantilla, las directivas se ejecutan en orden.

mira 'Objeto de definición de directiva' en directive para obtener más información.

Espero que las respuestas.

Sin embargo, cuando dice que el controlador 'externo' depende del controlador 'interno', no se ve bien. En mi opinión personal, un controlador no debe estar atado con otro controlador. No estoy seguro de su caso de uso, pero debería haber una manera de romper la dependencia entre los dos controladores.

+0

Estaba teniendo este problema exacto, pero no ajustar los niveles de prioridad ayudó (no en 1.0.5 y no en 1.0.7 de todos modos). En mi caso, era el 'interno' dependiendo de un controlador del 'externo' y no es una forma fácil de romper esa dependencia ya que tengo varios 'internos' y hacer algo para uno requiere que les pase cosas a otros (es un acordeón avanzado) . – ivarni

Cuestiones relacionadas