在Knockout.js中反转一个数组

时间:2013-01-18 03:28:27

标签: knockout.js

我正在学习如何使用Knockout.js。我想显示observableArray内容被反转,所以我用这种方式使用Knockout反向函数:

   <ul  data-bind="foreach: anObservableArray.reverse()" >...</ul>

但是,它不起作用,也不会发生错误。当我尝试这个时:

<ul  data-bind="foreach: anObservableArray.slice(0).reverse()" >...</ul>

它按预期工作。我的问题是,当反向函数已经返回反向数组时,为什么我必须复制整个数组?

3 个答案:

答案 0 :(得分:6)

调用reverse实际上将就地反转数组(并返回它),因此您可能遇到多次反转的问题。

例如,如果您有两个块,例如:

<ul  data-bind="foreach: anObservableArray.reverse()" >...</ul>
<ul  data-bind="foreach: anObservableArray.reverse()" >...</ul>

第一个将被颠倒,第二个将回到原始顺序。

最好反转副本,特别是如果要添加和删除数组中的项目。

答案 1 :(得分:3)

我从这个问题的搜索得到了这个;为什么现在需要复制数组,

“knockout.js 2.2发生了变化,使得数组变异函数不会对可观察数组产生依赖。通常如果你想让一个计算器返回一个反转版本的数组,你将不会在原始数组上使用反向但在副本上。而不是        self.anObservableArray.reverse(), 做       self.anObservableArray.slice(0).reverse() 示例:http://jsfiddle.net/mbest/3QHM7/1/

基本上,它是为了避免在可观察数组上创建依赖。

答案 2 :(得分:1)

因为reverse()对源数组产生影响而不是返回一个副本数组,并且使用'foreach'绑定将其调用两次,这样你就可以在最终结果中获得相同的数组。

您可以使用以下代码进行测试:

<ul  data-bind="foreach: alert(anObservableArray.reverse())" >...</ul>