使用ko.mapping.fromJS

时间:2015-10-23 07:38:27

标签: javascript ajax knockout.js

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

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

1 个答案:

答案 0 :(得分:2)

尝试将其推入observableArray而不是替换它

<强>视图模型:

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

push.apply优于传统循环语句:

  

如果您的数组/集合有多个项目,并且您添加了   (array.push(item)一个接一个,然后通知订阅者   每次推送/添加操作。然后UI将具有该数字   刷新。这将损害UI页面的表现。

     

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

     

这就是差异和优势/用法   array.push.apply函数。

示例工作小提琴 here

使用utils.forEach here

进行示例工作