Подтвердить что ты не робот

Как получить наблюдаемую длину массива?

Я пытаюсь создать массив позиций контрактов (CLIN), которые будут отображаться в виде отдельных элементов div под заголовком общей информации контракта.

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

У меня есть jsFiddle, который иллюстрирует мою проблему. Для меня странно, что тег data-bind="text: clins.length() в теге HTML не возвращает ничего, но вместо этого ничего не делает.

Есть ли способ включить отладку в jsFiddle или я должен увидеть предупреждение/ошибку?

4b9b3361

Ответ 1

Ошибки с jsfiddle страниц отправляются в ваш браузер.

Что касается вашей ошибки, попробуйте следующее:

<span data-bind="text: clins().length">

Это превращает observableArray в array и использует свойство массива length.

См. обновил jsfiddle.

Ответ 2

TL; DR/Quick Fix

Выполните observableArray как функцию для получения базового массива, затем получите его длину:

<!--                                                     ↓↓                              -->
myObsArray length is: <span data-bind="text: myObsArray().length"></span>

Почему это происходит?

Позвольте мне дать ответ, который содержит некоторые подробности в дополнение к @kendaleiv solution, и это также отвечает на очень близкий вопрос, который, как я чувствую, у многих людей:

Почему myObsArray.length всегда возвращает 0 (ноль)?

Типичным воспроизведением такого сценария будет следующее:

ko.applyBindings({ myObsArray: ko.observableArray(["one", "two", "three"]) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
myObsArray.length = <span data-bind="text: myObsArray.length"></span>

Ответ 3

Для тех, кто хочет получить длину наблюдаемого массива без элементов _destroy ed, вы можете использовать эту функцию:

ko.observableArray.fn.totalVisible = function() {
    var items = this(), count = 0;

    if (items == null || typeof items.length === "undefined") {
        return 0;
    }

    for (var i = 0, l = items.length; i < l; i++) {
        if (items[i]._destroy !== true) {
            count++;
        }
    }

    return count;
};

Затем, чтобы использовать его:

myObservableArray.totalVisible();