Knockout.js 当填充一个大的可观察数组时,我可以加快击倒速度吗?

Knockout.js 当填充一个大的可观察数组时,我可以加快击倒速度吗?,knockout.js,Knockout.js,我有一个web应用程序,它对一些数据执行SOAP请求,并用结果填充淘汰视图模型。我目前得到大约1000行项目,必须推到我的淘汰viewmodel。在chrome中分析页面显示,大部分加载时间/CPU都花在knockout.js上。我想知道是否有办法延迟任何淘汰更新/处理,直到所有项目都被推到可观察数组中 编辑:更清楚地说,我想我是在找拖延或拖延之类的事情。但是看起来,从这一点来看,我最好先构建一个普通数组,然后填充整个可观察数组,而不是将每个项目直接推到可观察数组上。这可能会消除延迟或限制绑定的

我有一个web应用程序,它对一些数据执行SOAP请求,并用结果填充淘汰视图模型。我目前得到大约1000行项目,必须推到我的淘汰viewmodel。在chrome中分析页面显示,大部分加载时间/CPU都花在knockout.js上。我想知道是否有办法延迟任何淘汰更新/处理,直到所有项目都被推到可观察数组中


编辑:更清楚地说,我想我是在找拖延或拖延之类的事情。但是看起来,从这一点来看,我最好先构建一个普通数组,然后填充整个可观察数组,而不是将每个项目直接推到可观察数组上。这可能会消除延迟或限制绑定的需要。有什么建议吗?

也许另一种解决方案是将数组中的元素按20或50个项目的块插入到可观察数组中

由于您将向ObservalArray添加项目,knockout将在您添加项目时显示它们,但它可能会帮助您减少所需的CPU量,因为您可以在每个块之间添加延迟


可能值得一试。

如果您只需要替换
可观察数组的内容,则不需要在数组中循环

最有效的操作是将其设置为新值:

this.obsArray(newData);

我正在将大约850个项目拉入我的视图模型,并将它们显示在一个select中。在一个循环中推进大约需要15秒,并且线性退化

我在这里使用了valueHasMutated解决方案:


降到大约200ms(总的来说,包括到服务器的往返、数据库读取等)

当然,您可以按照其他答案中的建议对代码进行更改。另一种选择是使用我的延迟更新插件:


该插件将自动延迟对UI(或任何计算的可观察对象)的任何更新,直到在当前“线程”中完成所有更改之后。这可能是最好的方法:

function MyVM(){
    this.fooObsArray = ko.observableArray([]);
}

function Foo(){

var self = this;
self.vm = new MyVM();

this.pushSlow = function(arrayToBePushed){
    for (int i = 0; i < arrayToBePushed.length; i++){
        var element = arrayToBePushed[i];
        self.vm.fooObsArray.push(element);          //notifies ui foreach of elements => + delay
    }
}

this.pushFast = function(arrayToBePushed){
    var underlyingArray = self.vm.fooObsArray();

    for (int i = 0; i < arrayToBePushed.length; i++){
        var element = arrayToBePushed[i];
        underlyingArray.push(element);
    }

    self.vm.fooObsArray.valueHasMutated();          //notifies ui once all elements have been added => - delay
}
}
函数MyVM(){
this.fooObsArray=ko.observearray([]);
}
函数Foo(){
var self=这个;
self.vm=新的MyVM();
this.pushSlow=函数(ArrayToBepush){
for(int i=0;i+延迟
}
}
this.pushFast=函数(ArrayToBepush){
var underyingarray=self.vm.fooObsArray();
for(int i=0;i-delay
}
}

你使用KO.MAP吗?这个页面上的解决方案提供了一个巨大的性能提升,感谢圣诞礼物:我知道它已经晚了2年,但是如果你仍然活跃,考虑复制/粘贴代码,所以如果页面离线,我们仍然有它可以处理。如果它离线,你仍然可以通过archive.org看到它。。。虽然我更愿意陷入讨论,但我尊重地表示不同意。请查看“为链接提供上下文”指南的段落。不过,谢谢你的解决方案,它帮了我很多。你是怎么做到的?我正在绑定一个有255行11列的表,而knockout(3.4版)需要1500ms才能用Chrome绑定,而用IE11绑定则需要4800ms。我在80ms内检索数据,然后需要20倍的时间来绑定?在切换到knockout之前,我手动创建了行模板(构造为string并使用jquery添加),这非常快。我已经在使用vm.obsArray(newArray)方法。现在使用扩展器或
ko.options.deferUpdates=true本机支持这一方法