2014-08-27 18 views
10

Quindi sto cercando di spostare la mia libreria di plugin su Angular laddove possibile, solo per mantenere le cose coerenti. Il problema che sto incontrando è ottenere direttive da seguire dopo che tutte le direttive sui suoi figli sono state eseguite.Esegui direttiva dopo NG-Repeat

Solo per dare un po 'di chiarezza, l'obiettivo qui è quello di rendere più semplice per i nostri integratori (membri del team CSS/HTML) di aggiungere funzionalità dinamiche agli elementi semplicemente taggandoli con una funzione. Attualmente lo fanno tramite un attributo data-features. Ad esempio, per un dispositivo di scorrimento delle immagini è possibile che taggano un UL con un attributo data-features="imageSlider" per rendere questo UL un dispositivo di scorrimento.

Lungo queste linee, sto lavorando per spostare il modulo di scorrimento dell'immagine su angolare. Voglio che i miei integratori per essere in grado di scrivere qualcosa di simile:

<ul image-slider> 
    <li slide> 
     My Slide 1 
    </li> 
    <li slide> 
     My Slide 2 
    </li> 
    <li slide> 
     My Slide 3 
    </li> 
</ul> 

E posso trasformarla in un dispositivo di scorrimento di immagini in modo dinamico. I lavori di cui sopra fine, se il markup simile a questo:

<ul image-slider> 
    <li slide ng-repeat="slide in data.slider.slides"> 
     My Slide {{$index}} 
    </li> 
</ul> 

Poi il ng-repeat non finire prima la direttiva image-slider corre, il che significa che non ho accesso a tutte le diapositive di lavorare la mia magia.

C'è un modo per dire alla direttiva image-slider di attendere che le direttive al suo interno finiscano prima di sparare?

Ho letto le seguenti domande già:

Nessuno di questi sembrano avere una risposta a questo problema così ho pensato che avrei messo insieme una domanda molto più succinta nella speranza di trovare una risposta.

risposta

5

Quindi il modo più semplice per farlo è utilizzare directive to directive communication tra la direttiva diapositiva e la direttiva slider dell'immagine. Ecco cosa fai:

app.directive("imageSlider", [ '$log', function($log) { 
    return { 
     scope: { 
     }, 
     controller: function($scope) { 

      $scope.slides = []; 

      // this is a normal controller method that is NOT exposed to other directives 
      $scope.startGallery = function() { 
      }; 

      // this method will be exposed to directives that require imageSlider 
      this.addSlide = function(slide) { 
       $scope.slides.push(slide); 
      } 
     } 
    }; 
} ]); 


app.directive('slide', [ '$log', function($log) { 
    return { 
     require: "^imageSlider", 
     link: function($scope, elem, attribs, ctrls) { 
      ctrls.addSlide($scope); 
     } 
    }; 
} ]); 

In questo modo imageSlider può fornire una diapositiva un'interfaccia per comunicare. Notare la differenza in this.functionName vs $ scope.functionName. Il primo è un modo per esporre i metodi ad altre direttive.

+0

Perfetto, mi chiedevo se ci fosse un modo per farlo. – StephenRios

+1

@StephenRios, questa soluzione funziona, ma c'è un modo MOLTO più semplice per farlo. Ti sto postando una risposta adesso. – Kousha

8

Suggerisco un approccio molto più semplice. Utilizzare la funzione $timeout. Se si imposta il $timeout a zero, verrà eseguito esattamente dopo tutto quello che ha funzionato:

app.directive("imageSlider", [ '$timeout', function($timeout) { 
    return function(scope, element, attrs) 
    { 
     // your data is defined in scope.data.slider.slides 

     $timeout(function() 
     { 
      // This code will run whenever the page has finished processing 
      // So it will run after ng-repeat has finished 
     }, 0); 
    } 
}]); 
+4

Suggerirei di non utilizzare i timeout. I timeout sono hack. Sono altamente dipendenti dalla piattaforma e, se una piattaforma lenta (ala kindle o telefono) funziona, non è garantito il tiro al termine della ripetizione. La soluzione che ho dato, anche se più complessa, è garantita per funzionare quando ci si aspetta. – chubbsondubs

+0

Ho finito per abbandonare questo in favore di un evento personalizzato che sto sparando dopo aver ascoltato angolare per finire la sua compilazione iniziale. L'idea è la stessa però, e tu sei corretto, questo infatti si è rotto durante il caricamento della pagina lentamente ecc. Dopo aver fatto alcuni test. – StephenRios

Problemi correlati