2013-01-03 5 views
33

Sto provando a trovare il modo migliore per ottenere una posizione di indice all'interno di ngRepeat utilizzato con una direttiva personalizzata. Il problema che sto cercando di risolvere è che per ogni iterazione di ngRepeat, mi piacerebbe l'opzione di sapere dove mi trovo nell'iterazione, così posso creare un modello personalizzato basato su quella posizione dell'indice.

A meno che non ci sia un modo migliore di fare questo, sto tentando di fare questa funzionalità sulla base di questa documentazione da direttive:

& o & attr - fornisce un modo per eseguire un'espressione nel contesto dell'ambito genitore. Se non viene specificato alcun nome attr, si assume che il nome dell'attributo sia lo stesso del nome locale. Data e definizione del widget scope: {localFn: '& myAttr'}, quindi isola la proprietà dell'ambito localFn punterà a un wrapper di funzioni per il conteggio = numero + espressione del valore. Spesso è desiderabile passare dati dall'ambito isolato tramite un'espressione e all'ambito genitore, questo può essere fatto passando una mappa di nomi e valori di variabili locali nel wrapper di espressione fn. Ad esempio, se l'espressione è incremento (quantità), è possibile specificare il valore dell'importo chiamando il localFn come localFn ({amount: 22}).

http://docs.angularjs.org/guide/directive

che sto avendo qualche difficoltà a comprendere esattamente ciò che questa affermazione mi sta dicendo. Allora, che cosa ho cercato di fare è questo ...

Prima direttiva ngRepeat in uso insieme con la mia direttiva "testTemplate":

<ul> 
    <li my-attr="test()" my-directive ng-repeat="value in values" class="span2"> 
    </li> 
</ul> 

successivo, la mia direttiva definito:

angular.module('myModule', []) 
     .directive('myDirective', function() { 
      return { 
       replace : true, 
       transclude : true, 
       scope : { 
        test: '&myAttr' 
       }, 
       templateUrl: 'partials/myTemplate.html', 
       link : function(scope, element, attrs) { 
        alert(scope.count); 
       } 
      } 
     }); 

Finalmente, sto provando a definire la funzione "test" all'interno del controller per il modello principale in cui viene fatto riferimento alla direttiva.

function TestTemplateCtrl($scope, testTemplate) { 
    $scope.test = function() { 
     alert('in test'); 
     $scope.count = "1"; 
    } 
} 

Quindi il primo problema è che la mia funzione "test" nel genitore non viene eseguita affatto. Forse non sto capendo come dovrebbe essere chiamata la funzione di test all'interno del controller genitore. Ora non sto ancora aumentando, ma è il modo corretto di cui sopra per aumentare il mio conteggio quando arrivo a quel punto se riesco a far funzionare la funzione di test?

+1

Wow Penso che stavo rendendo questo più complicato quindi necessario. Posso solo prendere l'indice all'interno della mia funzione di collegamento con scope. $ Parent. $ Index.Mi piacerebbe ancora sapere perché la mia funzione di "test" non è stata attivata solo per riferimento futuro. – DavidB

risposta

47

Invece di scope.$parent.$index si potrebbe prendere in considerazione il passaggio dell'indice $ come un attributo direttiva:

<li my-directive index="{{$index}}" ng-repeat="value in values"> 

direttiva:

myApp.directive('myDirective', function() { 
    return { 
     replace: true, 
     // transclude: true, 
     scope: { 
      index: '@' 
     }, 
     template: '<div>testing {{index}}</div>', 
     link: function(scope, element, attrs) { 
      // ... 
     } 
    } 
}); 

Fiddle.

+0

Buona chiamata su questo. Questo è esattamente quello che stavo cercando di fare. – DavidB

+6

Nota: con la sintassi '@', dovrai usare attrs. $ Observ() se vuoi usare il valore dell'indice all'interno della funzione link - vedi [questa risposta] (http://stackoverflow.com/questions/14050195/what-is-the-difference-between-and-in-directive-scope/14063373 # 14063373) per ulteriori informazioni. (Non è necessario utilizzare $ observ() se si utilizza solo il valore in un modello, come mostrato nel violino.) –

+2

Personalmente, preferisco comunque scope. $ Parent. $ Index perché l'aggiunta di un indice è un ulteriori informazioni per gli utenti da ricordare quando tentano di utilizzare la direttiva. Utilizzando l'ambito. $ Parent. $ Index nel linker non solo consente di ottenere lo stesso risultato, ma pulisce anche la direttiva riducendo questo attributo non necessario. Progettare le direttive in modo intuitivo lo rende facilmente riutilizzabile da altre persone – zeroliu

2

Come hai fatto notare, puoi prendere l'indice usando $ indice.

Perché la funzione di test non sta funzionando, non l'hai eseguita. In funzione di collegamento del vostro direttiva avete bisogno di qualcosa di simile:

scope.$eval(attrs.myAttr);