2016-12-24 53 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(); 

这将返回空数组做。