JSON.stringify(ComplexArray)返回一个空字符串

时间:2014-02-26 13:45:34

标签: javascript jquery knockout.js

我有以下使用JQuery和Knockout的JavaScript(我有特殊理由一起使用2)

$(document).ready(
  function () {
      var Crime = function (Id, CaseNumber, DateOfIncident, Description) {
          var self = this;
          self.Id = Id;
          self.CaseNumber = CaseNumber;
          self.DateOfIncident = DateOfIncident;
          self.Description = Description;
      }

      var CrimesViewModel = function () {
          var self = this;
          //Data
          self.items = ko.observableArray()

          //operations
          addCrime = function () {
              if ($("#AddCrimeForm").valid()) {
                  crime = new Crime(0,
                      $("#AddCrimeForm #CaseNumber").val(),
                      $("#AddCrimeForm #DateOfIncident").val(),
                      $("#AddCrimeForm #Description").val());

                  self.items.push(this.crime);

                  $("#AddCrimeForm #CaseNumber").val("");
                  $("#AddCrimeForm #DateOfIncident").val("");
                  $("#AddCrimeForm #Description").val("");
              }
          }

          self.removeCrime = function (item) {
              self.items.remove(item);
          }

          loadCrimes = function (JSONstring) {
              try {
                  self.JSONItems = JSON.parse(JSONstring);
                  if (self.JSONItems != null)
                      if (self.JSONItems != null)
                          for (i = 0; i < self.JSONItems.length; i++)
                              self.items.push(self.JSONItems[i]);
              }
              catch (e) {
                  alert(e.message + "\n\n" + e.description + "\n\n" + e.stack)
              }
          }

          getCrimes = function () {
              var self = this;
              return JSON.stringify(self.items);
          }

      }

      var CrimesVM = new CrimesViewModel()

      ko.applyBindings(CrimesVM, $("#CrimeList")[0])

  }
);

如上面的代码所示,我有一个ViewModel,它基本上由一个包含Crime个对象的数组组成。

getCrimes()函数的意图是,在调用时,将数组序列化为JSON。

遗憾的是,getCrimes()函数返回一个空字符串,因为JSON.stringify(self.items)返回一个空字符串。

知道我在这里做错了吗?

**

更新

**

以下是工作代码,基于以下答案:

$(document).ready(
  function () {
      var Crime = function (Id, CaseNumber, DateOfIncident, Description) {
          var self = this;
          self.Id = Id;
          self.CaseNumber = CaseNumber;
          self.DateOfIncident = DateOfIncident;
          self.Description = Description;
      }

      var CrimesViewModel = function () {
          var self = this;
          //Data
          self.items = ko.observableArray()

          //operations
          addCrime = function () {
              if ($("#AddCrimeForm").valid()) {
                  crime = new Crime(0,
                      $("#AddCrimeForm #CaseNumber").val(),
                      $("#AddCrimeForm #DateOfIncident").val(),
                      $("#AddCrimeForm #Description").val());

                  self.items.push(this.crime);

                  //Update the correspoding hidden field
                  $("#CrimeCollection_New").val(ko.toJSON(self));

                  $("#AddCrimeForm #CaseNumber").val("");
                  $("#AddCrimeForm #DateOfIncident").val("");
                  $("#AddCrimeForm #Description").val("");                  
              }
          }

          self.removeCrime = function (item) {
              self.items.remove(item);
              //Update the correspoding hidden field
              $("#CrimeCollection_New").val(ko.toJSON(self));
          }

          loadCrimes = function (JSONstring) {
              try {
                  self.JSONItems = JSON.parse(JSONstring);
                  if (self.JSONItems != null)
                      if (self.JSONItems != null)
                          for (i = 0; i < self.JSONItems.length; i++)
                              self.items.push(self.JSONItems[i]);
              }
              catch (e) {
                  alert(e.message + "\n\n" + e.description + "\n\n" + e.stack)
              }
          }



      }

      var CrimesVM = new CrimesViewModel()

      ko.applyBindings(CrimesVM, $("#CrimeList")[0])

  }
);

1 个答案:

答案 0 :(得分:2)

因为self.items是一个Knockout observable,所以你应该使用Knockout函数.toJS()来获取值:ko.toJS(self.items)

或者,如果您想将项目直接转换为JSON,可以使用.toJSON()

Knockout: Loading and saving JSON data