2012-07-02 6 views
14

¿Por qué, cuando trato de usar knockout.js para enlazar texto usando $ index, obtengo el código de una función en lugar de un número?

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

En lugar de obtener 1, 2, 3, etc., me sale esto:

enter image description here

se puede ver, el último carácter de la imagen de arriba, que mi índice de cero es se agrega a 1. Si elimino el '+ 1' de mi enlace, obtengo 0, 1, 2 en lugar de la función.

¿Cómo le digo a knockout que evalúe la expresión? Tengo el mismo problema cuando envío el formulario. Mis campos de cadena se envían como una función en lugar del valor.

Respuesta

31

$ index es un observable, que es una función. Trate <span data-bind="text: $index() + 1"></span>

+0

Eso lo solucionó. ¿Por qué la documentación no tiene ejemplos con parens? http://knockoutjs.com/documentation/binding-context.html – rboarman

+1

Es un problema general al usar observables en expresiones. Si está utilizando lo observable por sí mismo, los enlaces aceptarán lo observable solo, pero cuando empiece a incluir observables en expresiones, debe usar el formulario() para acceder al valor real. Ver http://knockoutjs.com/documentation/observables.html para 'Leer y escribir observables'. –

+0

¡Gracias por la ayuda! – rboarman

4

Si utiliza

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

y, por ejemplo el valor del índice es 2, el texto de su período será: 21 y no 3.

debe definir una función en su modelo de vista , de esta manera:

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

y luego en su tramo que debe hacer:

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

Espero que esto ayude :)

+0

+1 por el simple hecho de que si el índice es 2, entonces al usar la técnica de respuesta aceptada obtienes 21, 23 o más en lugar de 3, 4 ecc. No entiendo cómo se aceptó la respuesta de aceptación, simplemente está mal (al menos con el nocaut 2.2.1). – firepol

+0

Aquí hay un jsFiddle ... parece funcionar con ambos métodos: S http://jsfiddle.net/BAEsx/24/ – Donatella

Cuestiones relacionadas