2012-03-28 9 views
18

Questo è probabilmente abbastanza semplice ma non riesco a trovarlo facilmente. In knockout.js, come stamperesti l'indice di un oggetto in un array osservabile su cui stai iterando usando il binding foreach?Knockout.js stampa l'indice dell'oggetto in foreach

+2

In KO 2.1.0 (beta è ora disponibile), è possibile utilizzare '$ index' per ottenere l'indice all'interno di un foreach. Ecco la discussione beta: https://groups.google.com/d/topic/knockoutjs/LdUfjGNZOj8/discussion. Simile a ciò che Matt descrive nella sua risposta, uso questa tecnica (aggiungi la funzione 'indexed' a observableArrays): http://stackoverflow.com/questions/9760861/apply-a-class-to-every-nth-template- element-with-knockoutjs –

+0

@RPNiemeyer: Sono sicuro al 98% che l'ho rubato da te sul forum Knockout! –

+0

@MattBurland no worries! –

risposta

11

Non è possibile. Non direttamente comunque. Io uso questa funzione me stesso per aggiungere una proprietà indice per gli oggetti nei miei ObservableArrays:

function indexSubscribe(array) { 
     array.subscribe(function() { 
      for (var i = 0, j = array().length; i < j; i++) { 
       var item = array()[i]; 
       if (!item.index) { 
        item.index = ko.observable(i); 
       } else { 
        item.index(i); 
       } 
      } 
     }); 
    }; 

Poi nel mio ViewModel, posso fare qualcosa di simile:

this.whatevers = ko.observableArray(); 
indexSubscribe(this.whatevers); 
+0

+1, soluzione lucida – Tyrsius

0

La soluzione seguente potrebbe essere una risposta tardiva. Ma se la tua scelta preferibile è con viewmodel la soluzione qui sotto ti aiuterà con l'ultima correzione.

In base alle librerie Knockout 3.1.0 e successive è semplice aggirare. È possibile passare index come argomento secondario a arrayForEach.

var items = ["Mercedes", "Volvo", "BMW"]; 

ko.utils.arrayForEach(items, function(item, index) { 
    console.log(item + ' ' + index); 
}); 

Spero che questa soluzione possa aiutare qualcuno.