2015-10-23 111 views
0

我有一个定义为ko.observableArray([])的值,并使用ko.mapping.fromJS将数据从ajax追加到它。但是,当我再次使用ko.mapping.fromJS时,从ajax调用的新数据获取将替换self.SampleArray,而不是追加新数据。我想保留以前的数据。它怎么能做到?保留原始值与ko.mapping.fromJS

function ViewModel() { 
 
    var self = this; 
 
    
 
    self.SampleArray = ko.observableArray([]); 
 
    
 
    $.ajax({ 
 
    .. 
 
    .. 
 
    success: function() {  
 
     ko.mapping.fromJS(data, {}, self.sampleArray()); 
 
    } 
 
    }) 
 
}

回答

2

尝试将其推入observableArray,而取代它

视图模型:的push.apply

function ViewModel() { 
    var self = this; 
    self.sampleArray = ko.observableArray([{ 
     'Hours': 0.5 
    }]) 
    setTimeout(function() { 
     alert('Mock of ajax call') 
     var newData = ko.mapping.fromJS(data1)(); 
     self.sampleArray.push.apply(self.sampleArray,newData) 
    }, 2000); 
} 
ko.applyBindings(new ViewModel()) 

优于传统循环语句:

如果阵列/集合了多个项目,如果你添加 (的Array.push(项目)一个接一个,则用户将针对每一个推 通知/添加操作。然后用户界面将有该号码 刷新。这会伤害UI页面的表现。

但是,如果您使用array.push.appy,那么您仍然可以添加多个 项目,但订阅者只会收到一次通知。

这是 array.push.apply函数的区别和优点/用法。

样品工作拨弄here

样品正在与utils.forEach here

+0

什么是使用ko.utils.arrayForEach超过$。每次的优势小提琴? – desmondlee

+0

@desmondlee'arrayForEach'来自knockout utility lib,其中'.each'是一个jQuery版本。 '.each'需要jquery库的功能,因为它是一个非ko函数。两者都做同样的事情。 –

+0

@desmondlee使用'push.apply'优化代码检查更新欢呼 –