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

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

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

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

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

4b9b3361

Ответ 1

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

$root и $parent относится к области видимости, поэтому он просто даст вам объект, содержащий наблюдаемый массив.

Однако вы можете воспользоваться этим, указав, что область видимости является вашим наблюдаемым массивом, используя привязку 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>​

Если вам действительно нужен наблюдаемый массив, вам нужно убедиться, что он не был распакован (в приведенном выше примере $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 -->