Knockout将新行添加到记录映射插件的列表中



我正在使用映射插件来更新视图模型,如下所示:

        $.ajax({
            type: "POST",
            url: url,
            data: data,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (json) {
                if (json.Page == 1) {
                    ko.mapping.fromJS(json, {}, self);
                } else {
                    self.List().push(ko.mapping.fromJS(json.List));
                }
                console.log(ko.toJSON(self.List()));
            },
        });

但是,对于第2页(DB中的下几个项),它没有更新List()可观察数组(在ajax调用完成时只添加NEW项),而是在控制台输出中添加了一个新的List=>Notice"["元素:

AJAX响应(json)

{"DiscountType":"Transaction","List":[{"ActivationDate":"/Date(1427215761818)/","CustomerName":"Another two 2","CustomerNumber":4328,"Percent":20,"HasDiscount":true},{

控制台输出:

[{"ActivationDate":"/Date(1388556000000)/","CustomerName":"Test1股份有限公司","Customer Number":10032,"Percent":20,"HasDiscount":true},{百分比":20,"HasDiscount":真}{"ActivationDate":"/Date(14280797661818)/","CustomerName":"Another tree","Customer Number":1212,"Percent":20,"HasDiscount":true}]]

我做错了什么?

要推送返回数组的各个元素,请执行类似的操作

success: function (json) {
    if (json.Page == 1) {
        ko.mapping.fromJS(json, {}, self);
    }
    else {
        json.List.forEach( 
            function(element) {
               self.List.push( ko.mapping.fromJS(element) );
            } );
        }
    console.log(ko.toJSON(self.List()));
        }

var vm = function() {
  var self = this;
  self.List = ko.observableArray([]);
  self.initiate = function() {
    json = JSON.parse('{"DiscountType":"Transaction","List":[{"ActivationDate":"/Date(1427215761818)/","CustomerName":"Another two 2","CustomerNumber":4328,"Percent":20,"HasDiscount":true},{"ActivationDate":"/Date(1428079761818)/","CustomerName":"Another tree","CustomerNumber":1212,"Percent":20,"HasDiscount":true}],"Page":2}');
    json.List.forEach(function(entry) {
      self.List.push(ko.mapping.fromJS(entry));
    });
  };
};
vm = new vm();
ko.applyBindings(vm);
vm.initiate();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js'></script>
<html>
<div data-bind='foreach: List'>
  <div data-bind='text: ActivationDate'></div>
</div>
</html>

最新更新