2013-05-02 81 views
4

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

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

JS /型号

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]); 

HTML

<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> 

回答

5

这是因为普通的可观察到的items实际上是A F它具有自己的length属性来指示预期的参数数目。

MDN's page on Functions (properties section)

length
指定函数预期的参数个数。

作为使用KnockoutJS库我还最初期望一个observableArray的长度为基础阵列的长度的显影剂,但我欣赏KO库不虽然重写此功能特性,如这可能会导致其他不需要的副作用。

+0

有道理 - 我知道这是一个功能,但并没有意识到'length'属性指示参数的数功能 - 很好的知道!谢谢。 – 2013-05-02 13:34:57

2

这是因为ko.observableArray实际上不是一个数组。它是一个返回底层数组的函数。

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

请检查此琴在那里我已经添加跨度与一些附加属性

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

+0

谢谢。我会接受Jeroen的答案,因为它更完整。不过,我感谢你的帮助! – 2013-05-02 20:48:38

相关问题