2016-02-22 36 views
0

我有这样的代码。主要问题是var jsonOfLog = JSON.stringify(data);给出正确的JSON "[{"name":"Jhon"},{"name":"Nick"},{"name":"Sanders"}]",但var jsonOfLog = JSON.stringify(test);给出undefinedjavascript数组序列化

为什么?这是类型问题或其他问题?如何解决这个问题?

function AppViewModel() { 

    self = this; 
    self.items = ko.observableArray(); 
    self.addItems = function() { 
     self.items.push({ Name: 'Test', Date: 'Test', Time: 'Test'}); 
    } 
    function time_format(d) { 
     hours = format_two_digits(d.getHours()); 
     minutes = format_two_digits(d.getMinutes()); 
     seconds = format_two_digits(d.getSeconds()); 
     return hours + ":" + minutes + ":" + seconds; 
    } 
    function format_two_digits(n) { 
     return n < 10 ? '0' + n : n; 
    } 
    self.save = function() { 
     data = [{ name: 'Jhon' }, { name: 'Nick' }, { name: 'Sanders' }]; 
     var test = self.items; 
     var jsonOfLog = JSON.stringify(test); 

     debugger; 
     $.ajax({ 
      type: 'POST', 
      dataType: 'text', 
      url: "ConvertLogInfoToXml", 
      data: "jsonOfLog=" + jsonOfLog, 
      success: function (returnPayload) { 
       console && console.log("request succeeded"); 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       console && console.log("request failed"); 
      }, 

      processData: false, 
      async: false 
     }); 
    } 
    self.capitalizeLastName = function() { 
     debugger; 

     var date = $("#date").val(); 


     $.ajax({ 
      cache: false, 

      type: "GET", 

      url: "GetByDate", 

      data: { "date": date }, 

      success: function (data) { 

       var result = ""; 

       $.each(data, function (id, item) { 
        var tempDate = new Date(); 
        var tempTime = item.Time; 
        debugger; 
        tempDate =new Date(parseInt(item.Date.replace("/Date(", "").replace(")/", ""), 10)); 
        self.items.push({ Name: item.Name, Date: (tempDate.getMonth() + 1) + '/' + tempDate .getDate() + '/' + tempDate.getFullYear(), Time: tempTime.Hours }); 
       }); 
      }, 

      error: function (response) { 
       debugger; 
       alert('eror'); 
      } 
     }); 

    } 
} 

ko.applyBindings(new AppViewModel()); 
+0

console.log(self.items)输出的内容是什么? – Prashant

+0

你的AppViewModel函数不应该有'return'吗? – Quantastical

+0

@Quantastical构造函数需要返回值是什么? – Tomalak

回答

0

你不能像这样对可观察数组进行字符串化;你最终将函数串起来而不是数组。你应该使用ko.toJSON(viewModel)函数。

请记住,在KnockOut中,您始终需要使用object.myObservableValue()来访问observable的实际值(而不是object.myObservableValue),否则您最终将使用该函数而不是该值。

+0

我不会在这里使用'ko.toJSON()'。简单地解开该值并让jQuery执行JSON处理是更简洁的方法。 – Tomalak

1

我在代码中看到了一些可能导致问题的东西。

首先,test变量是对self.items的引用,它是Knockout observableArray而不是原生JavaScript数组。我对Knockout并不是很熟悉,但是它可能不会作为数组序列化。

此外,在构造函数的第一行,您将分配给self而不使用var。这是为全局变量而不是本地赋值。如果在代码的其他地方有类似的构造,则可能会覆盖self引用。

+0

*“可能不能作为数组序列化”*它没有。 Knockout observables是函数,当你调用它们时你会得到他们包含的数组('var test = self.items();')。但这并不是OP代码中唯一的问题...... – Tomalak

+0

@Tomalak你是对的!谢谢!写答案我会接受它。 – A191919

+0

@ A191919请务必修复缺少的'var'问题。 –