2017-02-03 3 views
0

Я не JSON подходит как вложенные массивы, как следоватьkomapping.toJS не отображает вложенный наблюдаемый массив

[ 
        { 
        "Amount": 3250, 
        "CustomerAccountNumber": 1, 
        "EntityName": "a", 
        "Id": 1, 
        "IsValidationSuccess": false, 
        "IsWorkInProgress": true, 
        "ValidationErrors": [ 
         { 
         "CreationDate": "2017-01-23T00:00:00", 
         "Reason": "Error1" 
         }, 
         { 
         "CreationDate": "2017-01-23T00:00:00", 
         "Reason": "error2" 
         } 
        ] 
        }, 
        { 
        "Amount": 450, 
        "CustomerAccountNumber": 1, 
        "EntityName": "s", 
        "Id": 4, 
        "IsValidationSuccess": false, 
        "IsWorkInProgress": true, 
        "ValidationErrors": [ 
         { 
         "CreationDate": "2017-01-23T00:00:00", 
         "Reason": "error" 
         } 
        ] 
        }, 
        { 
        "Amount": 5600, 
        "CustomerAccountNumber": 2, 
        "EntityName": "f", 
        "Id": 2, 
        "IsValidationSuccess": false, 
        "IsWorkInProgress": true, 
        "ValidationErrors": [ 
         { 
         "CreationDate": "2017-01-23T00:00:00", 
         "Reason": "error" 
         } 
        ] 
        } 
       ] 
  • тогда я группе клиента нет и entityEntityName и заполнить модель наблюдаемого массив, используя который дает мне следующий JSON

     [ 
        { 
        "Count": 2, 
        "CustomerAccountNumber": 1, 
        "Entities": [ 
         { 
         "Count": 1, 
         "Entity": [ 
          [object Object] 
         ], 
         "EntityName": "a", 
         "Sum": 3250 
         }, 
         { 
         "Count": 1, 
         "Entity": [ 
          [object Object] 
         ], 
         "EntityName": "b", 
         "Sum": 450 
         } 
        ], 
        "Sum": 3700 
        }, 
        { 
        "Count": 1, 
        "CustomerAccountNumber": 2, 
        "Entities": [ 
         { 
         "Count": 1, 
         "Entity": [ 
          [object Object] 
         ], 
         "EntityName": "c", 
         "Sum": 5600 
         } 
        ], 
        "Sum": 5600 
        } 
    ]

    , а затем, когда мне нужно вернуться в JS, то TOJs не отображение вложенных массивов, но модель связывания в HTML с нокаутом связывает данные правильно.

komapping.toJS(viewModel.result())

дает мне следующий результат - он не отображает вложенный массив, есть ли способ, мы можем это исправить?

обновление

viewModel = function() { 
    var self = this; 
    self.transactionLines = ko.observableArray(); 
    self.result = ko.observableArray(); 

} 

После AJAX нагрузки Я толкаю объект observableArray после группировки

 var byAccountNo = groupBy(data, function (item) { 
      return [item.CustomerAccountNumber]; 
     }); 

     _.each(byAccountNo, function (item) { 
      var byEntity = groupBy(item, function (i) { 
       return [i.EntityName]; 
      }); 

      var obj = { 
       CustomerAccountNumber: item[0].CustomerAccountNumber, 
       Entities: ko.observableArray() 
      }; 

      _.each(byEntity, function (itemEntity) { 

       var objByEntity = { 
        EntityName: itemEntity[0].EntityName, 
        Entity: ko.observableArray() 
       }; 

       _.each(itemEntity, 
        function (inner) { 
         var result = ko.mapping.fromJS(inner); 
         self.transactionLines.push(result); 
         objByEntity.Entity.push(result); 
        }); 

       objByEntity.Sum = ko.pureComputed({ 
        read: function() { 
         var total = 0; 
         _.each(objByEntity.Entity(), function (item) { 
          total += item.Amount(); 
          }); 
         return total; 
        }, 
        owner: objByEntity 
       }); 


       objByEntity.Count = ko.pureComputed({ 
        read: function() { 
         return objByEntity.Entity().length; 
        }, 
        owner: objByEntity 
       }); 

       obj.Entities.push(objByEntity); 
      }); 

      obj.Sum = ko.pureComputed({ 
       read: function() { 
        var total = 0; 
        _.each(obj.Entities(), function (item) { 
         total += item.Sum(); 
        }); 
        return total; 
       }, 
       owner: obj 
      }); 

      obj.Count = ko.computed({ 
       read: function() { 
        var total = 0; 
        _.each(obj.Entities(), function (item) { 
         total += item.Count(); 
        }); 
        return total; 
       }, 
       owner: obj 
      }); 


      self.result.push(obj); 
     }); 

    }; 

ответ

0

Глядя на ko.mapping.toJS()documentation, это не удивительно,:

Это создаст unmapped object, содержащий только свойства отображенный объект, который был частью вашего исходного объекта JS. Таким образом, в Другими словами, любые свойства или функции, которые вручную добавлены в вашей модели представления игнорируются

Я думаю, вы можете попробовать ko.toJS() или ko.toJSON() вместо ko.mapping.toJS() если вы смотрите на экспорт объект.

См. documentation for ko.toJS().

+0

все в этом объекте создается вручную, но все же он отображает все, кроме вложенного массива Entity. ko.js тоже не работает, и toJSON даст строку, которую я не хочу. – jjj

+0

@JitendraAanadani вам нужно предоставить больше кода. Как вы изменяете свои данные? Как определяется ваш 'viewModel'? –

+0

обновлен с помощью кода Viewmodel – jjj

Смежные вопросы