Могу ли я получить наблюдаемый массив, который я предвижу внутри?

Это, вероятно, лучше объяснить на примере. Это пример из блога Knockout о том, как использовать $parent, Однако в этом случае $parent по-видимому, так же, как $root, так что я не вижу выгоды.

Где это говорит $parent.lastUpdatedЯ хотел бы вместо этого получить доступ к наблюдаемому массиву, this.products, Я понимаю, что могу сказать $root.products, Однако я хотел бы обобщить это, а не писать это явно для каждого списка.

Я на самом деле буду использовать это в сочетании с ko.contextFor,

1 ответ

Решение

Вы не можете получить доступ (в общем) к observableArray, который зацикливается непосредственно внутри цикла foreach.

$root а также $parent о области видимости, так что он просто даст вам объект, который содержит observableArray.

Тем не менее, вы можете воспользоваться этим, убедившись, что область является вашим observableArray, используя with связывание.

Если вам просто нужен базовый массив, то вы можете сделать:

<div data-bind="with: products">
    <ul data-bind="foreach: $data">
        <li>
            <strong data-bind="text: name"></strong>
            &mdash;
            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>
            &mdash;
            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>
            &mdash;
            Array length: <em data-bind="text: $parent.theArray().length"></em>
        </li>
    </ul>
<!-- /ko -->
Другие вопросы по тегам