Kendo DataSource在数据源同步上附加Schema Id

时间:2013-08-21 08:19:28

标签: javascript arrays asp.net-web-api kendo-ui

只想知道为什么javascript的push方法插入“index”

   var agendaBatch=[];

    for(var i=0; i<agendas.length; i++) {

        var agenda = {
            MeetingId: meetingId,
            Title: agendas[i].title,
            Description: agendas[i].description,
            Remarks: "",
        };

        agendaBatch.push(agenda);   
    }

    console.log(kendo.stringify(agendaBatch));
    dataSourceAgenda.add(agendaBatch);

    dataSourceAgenda.sync();

输出:

{"0":{"Title":"Agenda title","Description":"Agenda details","Remarks":""},
 "1":{"Title":"Agenda title","Description":"Agenda details","Remarks":""}}

我期望此输出符合我的Web API参数要求

[{"Title":"Agenda title","Description":"Agenda details","Remarks":""},
 {"Title":"Agenda title","Description":"Agenda details","Remarks":""}]

有任何建议我该怎么做?....

更新:刚刚发现,我正在使用kendo ui数据源,当我删除模式上的Id时修复了问题

var dataSourceAgenda = new kendo.data.DataSource({
            transport: {
                type: "odata",
                create: {
                    type: "POST",
                    url: API_URL + "/agendas",
                    contentType: "application/json; charset=utf-8",
                    dataType: 'json'
                },
                parameterMap: function (options, operation) {
                    if (operation !== "read" && options) {
                        return kendo.stringify(options);
                    } 
                }
            },
            schema: {
                model: {
                    id: "Id", //I get my desired output if this is removed
                    fields: {
                        MeetingId: { type: "number" },
                        Title: { type: "string" },
                        Description: { type: "string" },
                        Remarks: { type: "string" },
                    }
                },
            }        
        });  

但是我需要其他函数中的Id参数,无论如何我都可以在不删除kendo数据源中的Id的情况下执行此操作。

更改了问题标题!

2 个答案:

答案 0 :(得分:3)

根据Kendo UI DataSource(here)的文档,add方法接受Object而不是array Object

此外,您使用名为id的{​​{1}}字段作为Id的字段,不在model的字段中。

尝试执行以下操作:

var dataSourceAgenda = new kendo.data.DataSource({
    transport: {
        create      : function (op) {
            ...
        },
        parameterMap: function (options, operation) {
            if (operation !== "read" && options) {
                return kendo.stringify(options.models);
            }
        }
    },
    batch    : true,
    schema   : {
        model: {
            id    : "Id", //I get my desired output if this is removed
            fields: {
                Id         : { type: "number" },
                MeetingId  : { type: "number" },
                Title      : { type: "string" },
                Description: { type: "string" },
                Remarks    : { type: "string" }
            }
        }
    }
});

即:

  1. batch设置为true,以便在您调用sync时能够一次发送多个请求。
  2. Id定义中定义schema.model.fields
  3. 执行stringify的{​​{1}}。

答案 1 :(得分:0)

由于agendaBatch显然是一个数组,我假设kendo.stringify没有正确地序列化它。您可以使用JSON.stringify

请注意,旧浏览器并未实现此功能。如果你需要支持它们,你可以包括道格拉斯克罗克福德的剧本:

https://github.com/douglascrockford/JSON-js/blob/master/json2.js


修改

现在你改变了问题 - 我对kendo ui并不熟悉,所以这只是一个疯狂的猜测,试图帮助你解决更新后的问题。

您似乎可以访问data功能中的beforeSend。您可以尝试根据自己的需要进行操作,例如:

beforeSend: function (xhr, s) {
    var arrayData = [];

    for (var id in s.data) {
        arrayData.push(s.data[id]);
    }

    s.data = arrayData;
}