Ответ 1
Вы не можете получить доступ (в общем случае) к наблюдаемому массиву, который зацикливается непосредственно внутри цикла foreach.
$root
и $parent
относится к области видимости, поэтому он просто даст вам объект, содержащий наблюдаемый массив.
Однако вы можете воспользоваться этим, указав, что область видимости является вашим наблюдаемым массивом, используя привязку with
.
Если вам нужен только базовый массив, вы можете сделать следующее:
<div data-bind="with: products">
<ul data-bind="foreach: $data">
<li>
<strong data-bind="text: name"></strong>
—
Array length: <em data-bind="text: $parent.length"></em>
</li>
</ul>
</div>
Если вам действительно нужен наблюдаемый массив, вам нужно убедиться, что он не был распакован (в приведенном выше примере $data
уже развернут). Для этого вы можете нормализовать имя массива и искать его в своем шаблоне, например:
<div data-bind="with: { theArray: products }">
<ul data-bind="foreach: theArray">
<li>
<strong data-bind="text: name"></strong>
—
Array length: <em data-bind="text: $parent.theArray().length"></em>
</li>
</ul>
</div>
Вот пример: http://jsfiddle.net/rniemeyer/T6JvV/
Если вы не можете жить с дополнительным div
, то вы, безусловно, можете использовать привязки к потоку без контейнера, например:
<!-- ko with: { theArray: products } -->
<ul data-bind="foreach: theArray">
<li>
<strong data-bind="text: name"></strong>
—
Array length: <em data-bind="text: $parent.theArray().length"></em>
</li>
</ul>
<!-- /ko -->