2013-05-02 84 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

相關問題