2012-07-02 8 views
14

Dlaczego podczas próby użycia knockout.js do wiązania tekstu za pomocą $ index, otrzymuję kod funkcji zamiast liczby?

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

Zamiast się 1, 2, 3 itd., Mam to:

enter image description here

Można zobaczyć, do ostatniego znaku w powyższy obrazek, że mój wskaźnik zera jest dodane do 1. Jeśli usunę "+ 1" z mojego powiązania, otrzymam 0, 1, 2 zamiast funkcji.

Jak powiedzieć nokautowi, aby ocenić wyrażenie? Mam ten sam problem, kiedy przesyłam formularz. Moje pola łańcuchowe są przesyłane jako funkcja zamiast wartości.

Odpowiedz

31

Indeks $ jest obserwowalny, co jest funkcją. Spróbuj <span data-bind="text: $index() + 1"></span>

+0

To naprawiło to. Dlaczego dokumentacja nie ma przykładów z parens? http://knockoutjs.com/documentation/binding-context.html – rboarman

+1

Jest to ogólny problem podczas korzystania z obserwowalnych w wyrażeniach. Jeśli używasz samego obserwowalnego, powiązania zaakceptują to, co obserwowalne, ale gdy zaczniesz uwzględniać obserwowalne w wyrażeniach, musisz użyć formularza(), aby uzyskać dostęp do rzeczywistej wartości. Zobacz http://knockoutjs.com/documentation/observables.html dla "Czytanie i pisanie obserwowalnych". –

+0

Dzięki za pomoc! – rboarman

4

Jeśli używasz

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

i na przykład swoją wartość indeksu wynosi 2, tekst swojej rozpiętości będzie wynosić: 21, a nie 3.

należy zdefiniować funkcję w ViewModel coś takiego:

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

a następnie w swojej rozpiętości należy zrobić:

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

Mam nadzieję, że to pomoże :)

+0

+1 z prostego faktu, że jeśli indeks wynosi 2, to za pomocą techniki akceptowanej odpowiedzi otrzymujesz 21, 23 lub mniej zamiast 3, 4 ecc. Nie rozumiem, w jaki sposób akceptowana odpowiedź została zaakceptowana, jest po prostu błędna (przynajmniej z nokautem 2.2.1). – firepol

+0

Oto jsFiddle ... wydaje się działać z obiema metodami: S http://jsfiddle.net/BAEsx/24/ – Donatella

Powiązane problemy