7

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

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

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

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

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

4

3 回答 3

7

Calling reverse will actually reverse the array in-place (and return it), so you could be running into an issue where it is getting reversed multiple times.

For example, if you had two blocks like:

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

The first would be reversed and the second would be back to the original order.

Better to reverse the copy, especially if you will be adding and removing items from the array.

于 2013-01-18T03:57:06.577 回答
3

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

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

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

于 2014-09-09T06:21:37.250 回答
1

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

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

<ul  data-bind="foreach: alert(anObservableArray.reverse())" >...</ul>
于 2013-12-31T07:35:23.670 回答