2012-08-17 9 views
5

Quindi ho appena iniziato ad utilizzare AngularJS e, a parte un piccolo inconveniente, sembra perfettamente a posto finora. Diciamo che ho due direttive, una delle quali richiede l'altro, in questo modo:AngularJS: templateUrl definisce la costruzione del controller, le interruzioni di codice dipendenti

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' 
     }; 
    }); 

utilizzato nel qualcosa di HTML come questo:

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

Se outer.html carichi prima inner.html, allora non c'è problema a tutti.<outer> viene trasformato correttamente e viene assegnato un ambito e un controller e <inner> riceve quel controller correttamente.

Se i modelli di carico nell'ordine opposto, tuttavia, <inner> è legata prima <outer> s’di controllo è stato creato, e non riesce con il messaggio di errore‘Error: nessun controller: esterno’.

Ho provato allegando un ritardo carico lato server per inner.html, e finchè outer.html carichi prima, non ci sono problemi di sorta ovunque. Allo stesso modo, se inserisco il modello di outer (ad esempio usando template anziché templateUrl), quel modello diventa disponibile per primo e tutto funziona splendidamente.

Qualcuno sa di un modo di utilizzare templateUrl sulle direttive richieste da altre direttive? Nel mio codice attuale, è essenziale che la direttiva interna abbia accesso al controller esterno e preferirei preferibilmente losu template perché il primo separa il layout dal comportamento e rende molto più semplice configurare i modelli anche dopo il comportamento. il codice è diventato grande.

Grazie in anticipo, e mi dispiace se questo è già stato chiesto prima; Non sono riuscito a trovare domande equivalenti su Stack Overflow.

risposta

2

Quando si definiscono più direttive all'interno di uno stesso modulo, è possibile assegnare una priorità che si occupa dell'ordinamento in cui devono essere eseguite le direttive. Nel tuo caso, dai 'esterno' più priorità a quella interiore. Quindi, indipendentemente dal momento in cui il modello viene caricato, le direttive vengono eseguite in ordine.

Vedere "Oggetto definizione direttiva" in directive per ulteriori spiegazioni.

Spero che le risposte.

Tuttavia, quando si dice che il controller "esterno" dipende dal controller "interno", non sembra buono. A mio parere personale, un controller non dovrebbe essere legato a un altro controller. Non sono sicuro del tuo caso d'uso, ma dovrebbe esserci un modo per rompere la dipendenza tra i due controller.

+0

Avevo questo problema esatto, ma non ho aiutato a modificare i livelli di priorità (non su 1.0.5 e non su 1.0.7 comunque). Nel mio caso è stato il 'inner' a dipendere da un controller dal 'outer' e non è un modo semplice per rompere quella dipendenza dal momento che ho molti 'inner' e fare qualcosa per uno richiede che le cose accadano agli altri (è una fisarmonica avanzata) . – ivarni

Problemi correlati