Как получить наблюдаемую длину массива?
Я пытаюсь создать массив позиций контрактов (CLIN), которые будут отображаться в виде отдельных элементов div
под заголовком общей информации контракта.
Я могу заставить обычные наблюдаемые работать, но кажется, что передача массива через конструктор для модели представления не создает никакой части наблюдаемого массива clins.
У меня есть jsFiddle, который иллюстрирует мою проблему. Для меня странно, что тег data-bind="text: clins.length()
в теге HTML не возвращает ничего, но вместо этого ничего не делает.
Есть ли способ включить отладку в jsFiddle или я должен увидеть предупреждение/ошибку?
Ответы
Ответ 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();