Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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_Performance_Knockout.js - Fatal编程技术网

Javascript 击倒表现

Javascript 击倒表现,javascript,performance,knockout.js,Javascript,Performance,Knockout.js,如何一次将所有值添加到observableArray?在我的例子中,在循环中添加值的速度非常慢。下面是一个JSFIDLE示例。 由于您正在清除整个可观察阵列,因此实现此目的的一种方法是: var viewModel = { name: "base", addingValue:new ko.observable(), someArr: new ko.observableArray(["123","432","sdafasd","xrere"]), add: f

如何一次将所有值添加到
observableArray
?在我的例子中,在循环中添加值的速度非常慢。下面是一个JSFIDLE示例。

由于您正在清除整个可观察阵列,因此实现此目的的一种方法是:

var viewModel = {
    name: "base",   
    addingValue:new ko.observable(),
    someArr: new ko.observableArray(["123","432","sdafasd","xrere"]),
    add: function()
    {
        this.someArr.push(this.addingValue());
    },
    updateSomeArr:function()
    {
        var temp = [];

        for(var i=0;i<5;i++)
        {
            temp.push("555565");
        }

        this.someArr(temp);
    }
}
var viewModel={
名称:“基地”,
addingValue:new ko.observable(),
新的ko.observableArray([“123”、“432”、“sdafasd”、“xrere”),
添加:函数()
{
this.someArr.push(this.addingValue());
},
updateSomeArr:function()
{
var-temp=[];

对于(var i=0;i已经有一个选定的答案,但我认为以下内容会有所帮助。您可以通过执行可观察数组来禁用观察行为,以获得底层数组实现:

var underlyingArray = viewModel.someArr();
然后,您可以将项目添加到
underyingarray
,而无需触发
someArr
事件。添加项目后,请调用:

viewModel.someArr.valueHasMutated();
这将导致触发事件,通知依赖于viewModel.someArr()的所有可观察对象


就是这样

关于向阵列性能问题添加项目,我有一个注意事项,您应该使用array\u name[array\u name.length-1]=您的项目;此行比push方法快。我想是的,请参阅本文,很抱歉我弄错了它的array\u name[array\u name.length]=你的项目这一个可能很有用也没问题。还有一种方法可以“关闭”观察行为,更新模型,然后重新打开--但我似乎找不到它的页面。使用array\u name[array\u name.length-1]=项目;比推送更快method@JamesD'Angelo:我发现方法ko.utils.unwrapobbservable,但找不到方法“打开”observable Behavior我会继续寻找代码示例。如果我找到了,我会将其添加到我的答案中。仍然不明白为什么最优雅和正确的答案被否决:)。如果您能给出解释,我将不胜感激。这确实是将所有项同时推送到一个数组的最佳方法。下面是一篇关于其用法的帖子@Akshat谢谢!在连续两次对我的答案投反对票后,我开始认为没有读过它的人会真正尝试学习javascript:)。再次感谢。这绝对是最好的方法。谢谢!已经阅读了整个链接文章(array.push!=array.push.apply)我只能说@AGS确实是正确的,并在文章的JSFIDLE中进行了说明。
var myArray = ko.observableArray([]);
var valuesToInsert = [1,2,3];
myArray.push.apply(myArray, valuesToInsert);