Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 排序时,敲除计算数组不通知订阅服务器_Javascript_Knockout.js - Fatal编程技术网

Javascript 排序时,敲除计算数组不通知订阅服务器

Javascript 排序时,敲除计算数组不通知订阅服务器,javascript,knockout.js,Javascript,Knockout.js,我有一个敲除计算数组,它将过滤器应用于另一个可观察数组。然后我想对计算出的数组进行排序,并且可以成功地完成这项工作,但是在应用另一个过滤器之前,数组不会在视图中自行更新 我尝试创建另一个可观察数组,使用计算值作为其数据,并使用新的可观察数组而不是计算数组,但这不起作用。我还尝试订阅计算数组并获取新值并将其赋给可观察数组,但这也不起作用。可能值得注意的是,当计算数组被排序时,订阅者不会收到新值的通知 this.itemAccessories = ko.observableArray() t

我有一个敲除计算数组,它将过滤器应用于另一个可观察数组。然后我想对计算出的数组进行排序,并且可以成功地完成这项工作,但是在应用另一个过滤器之前,数组不会在视图中自行更新

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

  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)
    }
  })

我希望当sort函数更改数组的顺序时,视图会更新。

当您调用
[].sort()
时,它会对
数组进行排序,但在KO的情况下,它不会更新可观察对象

尝试这样做:

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

还有一个更简单的解决方案。只需直接从observable而不是从其内容调用
.sort()
方法:

lineVm.searchItemAccessories.sort(function(a, b){return b.itemNumber - a.itemNumber})
下面是一个工作示例:

const testArray=ko.observatarray([8,2,7,3,1,4,6,9,5]);
subscribe(newVal=>console.log('Array updated:',newVal.join(','));
testArray.sort()

您无法写入计算值,因此无法工作,然后我尝试执行相同的操作,但对于另一个数组,则是lineVm.sortedItemAccessories(sortedItems),这对我有效。
lineVm.searchItemAccessories.sort(function(a, b){return b.itemNumber - a.itemNumber})