2016-12-24 21 views
1

因此,這裏是我在Github上工作的項目:https://github.com/joelt11753/Udacity-mapKnockout.JS陣列 - 嘗試重置陣列不工作

在這個程序中,我有一個從列表中創建一個菜單。我正在使用HTML選擇元素過濾此菜單。默認情況下,顯示所有內容。當選擇另一個選項時,菜單將會改變。目前的問題是每次運行過濾器時都需要重置菜單列表。

看看app.js文件,它位於js文件夾中。在第8行有一個計算的可觀察值,用於過濾菜單。請注意,在第10行,我將viewList()重置爲空。它需要是空的,所以我可以根據用戶選擇重新開始並過濾。但是,第10行僅在選擇默認選項時纔有效。默認值是第11行的「if」。第20行啓動顯示過濾菜單的塊。第21行的console.log顯示正確的數字,但不會發生重置。基本上,我的問題是,爲什麼每次選擇時重置都不起作用?如果您嘗試使用該應用程序,則當您選擇其他選項時,除了默認選項以外,菜單應該變爲空白。但事實並非如此。

謝謝你們!

+0

你可以在javascript arr = [1,2,3,4]; arr.splice(0).. –

+0

很酷,這樣一個作品。但是,爲什麼不將數組設置爲空,如= [];加工? – Coder

回答

0

讓我們從你如何重置數組開始。這

this.viewList = []; 

將無法​​正常工作。爲什麼?因此認爲viewList最初是什麼。這是一個ko.observableArray。但是您正在分配一個普通數組,因此失去了observableArray提供的任何功能。要清除它正確的方法是這樣的:

this.viewList.removeAll(); 

注意不要這個表達式的值分配回viewList。這是因爲removeAll突變了集合本身,而不是創建新的集合。同時考慮宣佈永久的參考對象,例如:

var ViewModel = function() { 
    var self = this; 
    ... 
} 

這是因爲一個事實,即對象this點,可以改變總體上是好的做法。但是通過這種方式,您正在創建對象創建時的「快照」,換句話說就是創建對象本身。回到您的問題,如果您使用viewList.removeAll(),則下拉列表下方顯示的元素將會正確更改。因爲我不知道要顯示的項目應該來自哪裏(因爲您只將console.log寫入else˙分支),請檢查此問題,並在有更多問題時更新您的問題。

1

您可以用這種方式

var arr = [1,2,3,4]; 
arr.splice(); 

這將返回空數組做。