2016-02-22 2 views
0

У меня такой код. Основная проблема заключается в том, что var jsonOfLog = JSON.stringify(data); дает правильный JSON "[{"name":"Jhon"},{"name":"Nick"},{"name":"Sanders"}]", но var jsonOfLog = JSON.stringify(test); дает undefined.javascript array serializing

Почему? Это проблема с типами или чем-то еще? Как это исправить?

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

какой же консоль.log (сам.items) мощность? – Prashant

+0

Должна ли ваша функция 'AppViewModel' иметь' return'? – Quantastical

+0

@Quantastical Что для функции конструктора требуется для возвращаемого значения? – Tomalak

ответ

0

Вы не можете усилить наблюдаемый массив; вы в конечном итоге строит функцию, а не массив. Для этого вы должны использовать функцию ko.toJSON(viewModel).

Помните, что в KnockOut вам всегда нужно использовать object.myObservableValue() для доступа к фактическому значению наблюдаемого (вместо object.myObservableValue), иначе вы в конечном итоге используете функцию вместо значения.

+0

Я бы не использовал 'ko.toJSON()' здесь. Просто разворачивая значение и позволяя jQuery делать обработку JSON, это более чистый подход. – Tomalak

1

Я вижу пару вещей в вашем коде, которые могут вызвать проблему.

Во-первых, переменная test является ссылкой на self.items, что является нокаутом observableArray, а не родным массивом JavaScript. Я не очень хорошо знаком с Knockout, но это не может быть сериализовано как массив.

Кроме того, в первой строке функции вашего конструктора вы назначаете self без использования var. Это присваивает значение глобальной переменной вместо локальной. Если у вас есть аналогичная конструкция в другом месте вашего кода, вполне вероятно, что ссылка self будет перезаписана.

+0

* ", который не может быть сериализован как массив" * Это не так. Нокаут-наблюдаемые - это функции, вы получаете массив, который они содержат, когда вы вызываете их ('var test = self.items();'). Но это далеко не единственная проблема в коде OP ... – Tomalak

+0

@Tomalak вы правы! Благодаря! Напиши ответ, я получу его. – A191919

+0

@ A191919 Пожалуйста, не забудьте исправить недостающую проблему 'var'. –