Вы не можете получить доступ (в общем) к observableArray, который зацикливается непосредственно внутри цикла foreach.
$root
и $parent
относятся к области видимости, поэтому она просто даст вам объект, содержащий observableArray.
Однако вы можете воспользоваться этим, убедившись, что область действия - ваш observableArray, используя привязку 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>
Если вам действительно нужен массив observableArray, то вам нужно убедиться, что он не был развернут (в приведенном выше примере $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 -->