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.
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