2012-07-02 10 views
14

Perché, quando provo a usare knockout.js per legare del testo usando $ index, ottengo il codice di una funzione invece di un numero?

<tbody data-bind="foreach: MyList"> 
    <tr> 
    <td><span data-bind="text: $index + 1"></span></td> 
    </tr> 
</tbody> 

Invece di ottenere 1, 2, 3, ecc, ottengo questo:

enter image description here

si può vedere, per l'ultimo carattere nell'immagine sopra, che il mio indice di zero è aggiunta a 1. Se rimuovo il '+ 1' dal mio binding, ottengo 0, 1, 2 invece della funzione.

Come si dice a knockout per valutare l'espressione? Ho lo stesso problema quando invio il modulo. I miei campi di stringa vengono inviati come funzione al posto del valore.

risposta

31

$ index è un osservabile, che è una funzione. Prova <span data-bind="text: $index() + 1"></span>

+0

Che risolto. Perché la documentazione non ha esempi con parens? http://knockoutjs.com/documentation/binding-context.html – rboarman

+1

È un problema generale quando si utilizzano osservabili nelle espressioni. Se stai usando l'osservabile da solo, i binding accetteranno l'osservabile da solo, ma quando inizi ad includere gli osservabili nelle espressioni devi usare il modulo() per accedere al valore reale. Vedi http://knockoutjs.com/documentation/observables.html per "Leggere e scrivere osservabili". –

+0

Grazie per l'aiuto! – rboarman

4

Se si utilizza

<span data-bind="text: $index() + 1"></span> 

e, ad esempio il valore di indice è 2, il testo del vostro arco sarà: 21 e non 3.

si dovrebbe definire una funzione nel vostro ViewModel , in questo modo:

self.itemNumber = function(index) { 
    return index + 1; 
} 

e poi nel vostro arco si dovrebbe fare:

<span data-bind="text: $root.itemNumber($index())"></span> 

Spero che questo possa aiutare :)

+0

+1 per il semplice fatto che se l'indice è 2, quindi usando la tecnica di risposta accettata ottieni 21, 23 o così invece di 3, 4 ecc. Non capisco come sia stata accettata la risposta di accettazione, è semplicemente sbagliata (almeno con il knockout 2.2.1). – firepol

+0

Ecco un jsFiddle ... sembra funzionare con entrambi i metodi: S http://jsfiddle.net/BAEsx/24/ – Donatella

Problemi correlati