2013-07-12 12 views
1

這裏是jsFiddleKnockout.js ....我的Obserbles問題是什麼?

我的主要問題是玩可觀測數組。我有一個聯繫人列表,我希望過濾器,當你鍵入但根據調試我得到的「通常」的屬性沒有過濾列表:

self.contacts.length 

甚至

contact.name 

這些是可觀察的數組和可觀察的屬性。

所以排序不起作用,因爲它無法正確訪問left.name或right.name。不過,如果我將該屬性設置爲「正常」並且不可觀察,它就可以工作。
此外,實際的過濾器函數需要.peek()遍地調試器返回實際值,然後繼續在.name.toLowerCase()上失敗。

這似乎是當我定義一個可觀察的時候,我失去了它所謂的包裝的所有行爲。這是正常的還是我在我的環境中遇到了可怕的錯誤?


P.S

SO says: "links to jsFiddle must be accompanied by code" 

我說,所以它開始苛刻這類事情之前應該做處理JS/HTML/CSS問題,一個更好的工作。

+0

如果您不發佈任何代碼,您如何期待人們回答有關您的代碼的問題? –

+0

如何才能更好地處理JS問題?看起來像一個很好的元討論...雖然可能不太討論SO本身。 –

+0

我做了郵政編碼,但jsFiddle爲這類問題提供了更好的形式(小型完整示例)。SO可以嘗試提供類似的功能來處理小而完整的示例,或者至少嘗試解決具有多個文件的問題。元討論已經發生,圖書管理員贏了。他們總是贏。 – Quibblesome

回答

2

就像Matt已經說過的observableArray是一個函數,你需要調用函數訪問屬性...例如:

<span data-bind="text: contact().name"></span> 

如果你想訪問你可以使用一個特定的數組元素。 ..

self.contact()[0].name 

如果你想在數組的長度......

self.contact().length 

...因爲在模板中使用我通常會創建一個計算的功能時,這個長相醜陋...

self.hasContact = ko.computed(function() { 
    return self.contact().length; 
}); 

...如果你想過濾器/搜索陣列...

self.contactFilter = function() { 
    return ko.utils.arrayFilter(self.contact(), function(item) { 
     return ko.unwrap(item.name) == 'John' 
    }); 
}; 
+0

,這很有道理。非常感謝! – Quibblesome

2

可觀察到的陣列是一個函數,所以要訪問您需要的長度:

myArray().length 

myArray()將返回所有它的功能和性能的基本陣列。另外請務必檢查this以獲取有關可觀察陣列本身可用函數的更多信息。

+0

,這很有道理。非常感謝! – Quibblesome