为什么ko.observableArray.length不返回底层数组的长度?

Why doesn't ko.observableArray.length return length of underlying array?

本文关键字:数组 observableArray ko length 返回 为什么      更新时间:2023-09-26

使用Knockout,当使用observableArray时,必须获取底层数组(myArray())才能读取长度。我不明白为什么myArray.length不会返回底层数组的长度(相反它返回0)。这是一个bug还是有原因,我只是错过了?

JSFiddle: http://jsfiddle.net/jsm11482/LJVWE/

<

JS/模型/strong>

var data = {
    name: ko.observable("Test"),
    items: ko.observableArray([
        { name: ko.observable("First Thing"), value: ko.observable(1) },
        { name: ko.observable("Second Thing"), value: ko.observable(2) },
        { name: ko.observable("Third Thing"), value: ko.observable(3) }
    ])
};
ko.applyBindings(data, document.getElementsByTagName("div")[0]);

<div>
    <h1 data-bind="text: name"></h1>
    <ul data-bind="foreach: items">
        <li data-bind="text: value() + ': ' + name()"></li>
    </ul>
    <div>
        <strong>data.items.length == </strong>
        <!-- Expecting 3, get 0. -->
        <span data-bind="text: items.length"></span>
    </div>
    <div>
        <strong>data.items().length == </strong>
        <!-- Expecting 3, get 3. -->
        <span data-bind="text: items().length"></span>
    </div>
</div>

这是因为普通的items可观察对象实际上是一个函数,它有自己的length属性来指示期望的参数数量。

从MDN的功能页面(属性部分):


长度指定函数期望的参数个数。

作为使用KnockoutJS库的开发人员,我最初也期望一个observableArray的长度是底层数组的长度,但我确实很欣赏KO库没有重写这个函数属性,因为这可能会导致其他不必要的副作用。

这是因为。observableArray并不是一个数组。它是一个返回底层数组的函数。

在你的例子中,因为items是一个函数,你得到一个.length = 0

请检查这个提琴,我已经添加了一些额外的属性跨度

http://jsfiddle.net/LJVWE/3/