javascript - Knockout Computed Array 在排序时不通知订阅者

标签 javascript knockout.js

我有一个 knockout 计算数组,它将过滤器应用于另一个可观察数组。然后我想对计算出的数组进行排序并且可以成功地做到这一点,但是在应用另一个过滤器之前,数组不会在 View 中自行更新。

我已经尝试创建另一个使用计算值作为其数据的可观察数组,并使用新的可观察数组而不是计算数组,但这不起作用。我也尝试过订阅计算数组并​​获取新值并将其提供给可观察数组,但这也不起作用。可能值得注意的是,当对计算数组进行排序时,订阅者不会收到新值的通知。

  this.itemAccessories = ko.observableArray()
  this.sortedItemAccessories = ko.observableArray()
  this.searchItemAccessories = ko.computed(function() {
    let q = this.searchAccessories()
    if(q){
      return ko.utils.arrayFilter(this.itemAccessories(), function(i) {
        return i.itemNumber.toLowerCase().indexOf(q.toLowerCase()) >= 0
      })
    }
    else {
      return this.itemAccessories()
    }
  })
  this.searchItemAccessories.subscribe((value) => {
    if(value) {
      this.sortedItemAccessories(value)
    }
  })
  lineVm.searchItemAccessories().sort(function(a, b){return b.itemNumber -
  a.itemNumber})

我希望 View 在排序函数更改数组顺序时更新。

最佳答案

当您调用 [].sort() 时,它会对 array 进行排序,但在 KO 的情况下,它不会更新 observable。

尝试这样做:

var sortedItems = lineVm.searchItemAccessories().sort(function(a, b){return b.itemNumber - a.itemNumber});
lineVm.sortedItemAccessories(sortedItems); // this does the update

关于javascript - Knockout Computed Array 在排序时不通知订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57512166/

相关文章:

javascript - 如何在react中使用markerEnd绘制箭头

javascript - knockout js : what is the proper way to trade out an image for text

knockout.js - 强制更新受限制的计算属性

html - 我应该手动将自定义 knockout 元素注册到 DOM 吗?

javascript - jquery 多次添加相同的 div 元素

javascript - 引导下拉菜单中的 Kendo ComboBox

javascript - 函数 doGet 在请假审批脚本中不起作用

javascript - 何时使用 L.TileLayer 与 L.tileLayer

javascript - 使用 Knockout-Kendo.js 进行 ko 绑定(bind)自定义剑道网格的 header

javascript - 将 Base2 与 KnockoutJS View 模型结合使用