我正在学习如何使用Knockout.js。我想显示observableArray内容被反转,所以我用这种方式使用Knockout反向函数:
<ul data-bind="foreach: anObservableArray.reverse()" >...</ul>
但是,它不起作用,也不会发生错误。当我尝试这个时:
<ul data-bind="foreach: anObservableArray.slice(0).reverse()" >...</ul>
它按预期工作。我的问题是,当反向函数已经返回反向数组时,为什么我必须复制整个数组?
答案 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>