【问题标题】:Reverse an array in Knockout.js在 Knockout.js 中反转数组
【发布时间】:2014-09-09 14:21:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这是问题具有我正在寻找的实际答案/代码的罕见情况之一,谢谢。

标签: knockout.js


【解决方案1】:

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

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

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

第一个会被颠倒,第二个会回到原来的顺序。

最好反转副本,尤其是当您要在数组中添加和删除项目时。

【讨论】:

  • 我用两个元素初始化数组并调用“foreach: ObservableArray.reverse()”,有效地反转了数组,但是我尝试添加的元素之后,它们没有出现在屏幕上,所以这意味着我不能添加一个元素然后反转数组,因为它假设首先它添加元素然后绑定更新html,是吗?
  • 我试过了,效果不错,
    并且也尝试了上面的方法.. 仍然它按升序显示我
  • @RameshSangili - 你在做foreach: ActivityLogO.slice(0).reverse()吗?
  • 我们不能只为foreach 提供一个以相反顺序显示的选项。这肯定是很常见的,而且倒车是浪费的(虽然我意识到在时间上可能可以忽略不计)
【解决方案2】:

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

“在 knockout.js 2.2 中有一个更改,使数组变异函数不会创建对可观察数组的依赖。通常,如果您希望计算返回数组的反转版本,您将不会在原始数组上使用 reverse但在副本上。而不是 self.anObservableArray.reverse(), 做 self.anObservableArray.slice(0).reverse() 示例:http://jsfiddle.net/mbest/3QHM7/1/

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签