2016-02-22 38 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'問題。 –