在Knockout.js中反转一个数组

Leb*_*ara 6 knockout.js

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

   <ul  data-bind="foreach: anObservableArray.reverse()" >...</ul>
Run Code Online (Sandbox Code Playgroud)

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

<ul  data-bind="foreach: anObservableArray.slice(0).reverse()" >...</ul>
Run Code Online (Sandbox Code Playgroud)

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

RP *_*yer 6

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

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

<ul  data-bind="foreach: anObservableArray.reverse()" >...</ul>
<ul  data-bind="foreach: anObservableArray.reverse()" >...</ul>
Run Code Online (Sandbox Code Playgroud)

第一个将被反转,第二个将回到原始顺序.

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

  • @RameshSangili - 你在做`foreach: ActivityLogO.slice(0).reverse()`吗? (2认同)

use*_*962 5

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

“knockout.js 2.2 中进行了更改,使数组突变函数不会创建对可观察数组的依赖。通常,如果您希望计算返回数组的反向版本,您不会在原始数组上使用反向,而是在复制。代替 self.anObservableArray.reverse(),执行 self.anObservableArray.slice(0).reverse() 示例:http://jsfiddle.net/mbest/3QHM7/1/

所以基本上,这是为了避免创建对可观察数组的依赖。