【问题标题】:javascript array serializingjavascript数组序列化
【发布时间】:2016-06-04 06:56:01
【问题描述】:

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

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

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());

【问题讨论】:

  • console.log(self.items) 输出什么?
  • 你的AppViewModel函数不应该有return吗?
  • @Quantastical 构造函数需要返回值做什么?
  • @Tomalak 我以为他们刚刚调用了AppViewModel() 并将返回值传递给ko.applyBindings 参数。

标签: javascript json knockout.js


【解决方案1】:

我在您的代码中发现了一些可能导致问题的地方。

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

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

【讨论】:

  • “可能不会序列化为数组” 它不会。 Knockout observables 是函数,当你调用它们时你会得到它们包含的数组 (var test = self.items();)。但这并不是 OP 代码中唯一的问题......
  • @Tomalak 你是对的!谢谢!写答案我会接受的。
  • @A191919 请务必同时修复缺少的var 问题。
【解决方案2】:

你不能像这样对一个可观察的数组进行字符串化;你最终会字符串化函数而不是数组。您应该为此使用ko.toJSON(viewModel) 函数。

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

【讨论】:

  • 我不会在这里使用ko.toJSON()。简单地展开值并让 jQuery 进行 JSON 处理是更简洁的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
相关资源
最近更新 更多