Knockout не оценивает выражение при использовании $index в привязке

Почему, когда я пытаюсь использовать Knockout.js для привязки некоторого текста с помощью $index, я получаю код функции вместо числа?

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

Вместо того, чтобы получить 1, 2, 3 и т. д., я получаю это:

введите здесь описание изображения

По последнему символу на изображении выше видно, что мой нулевой индекс добавляется к 1. Если я уберу «+ 1» из своей привязки, я получу 0, 1, 2 вместо функции.

Как мне сказать нокауту оценить выражение? У меня такая же проблема при отправке формы. Мои строковые поля передаются как функция вместо значения.


person rboarman    schedule 02.07.2012    source источник


Ответы (2)


$index — наблюдаемая, то есть функция. Попробуйте <span data-bind="text: $index() + 1"></span>

person John Earles    schedule 02.07.2012
comment
Это исправило это. Почему в документации нет примеров со скобками? knockoutjs.com/documentation/binding-context.html - person rboarman; 03.07.2012
comment
Это общая проблема при использовании наблюдаемых в выражениях. Если вы используете наблюдаемое само по себе, привязки будут принимать только наблюдаемое, но когда вы начинаете включать наблюдаемые в выражения, вы должны использовать форму () для доступа к фактическому значению. См. knockoutjs.com/documentation/observables.html "Чтение и запись наблюдаемых". - person John Earles; 03.07.2012

Если вы используете

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

и, например, значение вашего индекса равно 2, текст вашего диапазона будет: 21, а не 3.

вы должны определить функцию в своей модели представления, например:

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

а затем в вашем диапазоне вы должны сделать:

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

Я надеюсь, это поможет :)

person Donatella    schedule 06.02.2013
comment
+1 за тот простой факт, что если индекс равен 2, то, используя технику принятого ответа, вы получаете 21, 23 или около того вместо 3, 4 ecc. Я не понимаю, как был принят ответ о принятии, это просто неправильно (по крайней мере, с нокаутом 2.2.1). - person firepol; 10.04.2013
comment
Вот jsFiddle... кажется, он работает с обоими методами: S jsfiddle.net/BAEsx/24 - person Donatella; 16.04.2013