如何在extjs4中的单个请求中向服务器端发送对象数组?

时间:2013-01-24 10:58:01

标签: javascript extjs extjs4

我在extjs4 MVC中工作,我遇到了一个问题,即如何在单个请求中发送对象数组。 我知道如何将单个对象发送到服务器。

1)这是我的一些控制器代码: -

    check:function () {
    console.log("Inside check function.");
    //creating objects in javascript
    var obj = new Object();
    for (var i = 0; i < 4; i++) {
        var inputs = document.getElementsByName(i);
        var radio = "";
        for (var j = 0; j < inputs.length; j++) {
            if (inputs[j].checked) {
                name = inputs[j].name;
                value = inputs[j].value;
                //obj[i].name1=name;
                obj[i] = {'questionId': name, 'option': value};
                console.log("questionId=" + name + " value=" + value);
                console.log("object name=" + obj[i].questionId + " Object value=" + obj[i].option);

                var check = Ext.ModelManager.create(
                    {
                        questionId: name,
                        option: value,
                    }, 'Balaee.model.qb.QbquestionoptionModel');
                console.log("User Infooooooooo:" + check.get('option'));
            }// End of if statment
        }// End of inner for loop
    }//End of outer for loop
    var storeObject = this.getStore('qb.QbquestionoptionStore');
    storeObject.sync();
    console.log("data send");

}// End of check function

2)模型类:---

Ext.define('Balaee.model.qb.QbquestionoptionModel',{
    extend: 'Ext.data.Model',
    idproperty:'',//fields property first position pk. 
    fields: ['optionId','questionId','isAnswer','option','media','keyword','mediaTypeId',],
    /*associations:[
    {type:'BelongsTo',  model:'Mediatype',  foreignKey:'mediaTypeId'},
    {type:'BelongsTo',  model:'Qbquestion', foreignKey:'questionId'},
    {type:'HasMany',    model:'Qbregistereduserfreequestionawnser', foreignKey:'answerOptionId'},
    ]*/
});

3)这是我的商店:---

Ext.define('Balaee.store.qb.QbquestionoptionStore',{
    extend: 'Ext.data.Store',
    model: 'Balaee.model.qb.QbquestionoptionModel',
    //autoLoad: true,
    proxy:
    {
        type:'ajax',
        api:
        {
            read:'http://localhost/balaee/Balaee/index.php?r=QuestionBank/qbpaper/SetUserAnswer11',
            create: 'http://localhost/balaee/Balaee/index.php?r=QuestionBank/qbpaper/SetUserAnswer12',
            update: 'http://localhost/balaee/Balaee/index.php?r=QuestionBank/qbpaper/SetUserAnswer13',
            //destroy: ,
        },//End of api 
        reader:
        {
            type:'json',
            //root: ,
            //successProperty: ,
        },//End of reader
        writer:
        {
            type:'json',
            root:'data'
        }   
    }//End of proxy
});//End of store

我该如何解决这个问题?请给出一些建议......

2 个答案:

答案 0 :(得分:6)

嗯,首先你必须把它作为JSON发送(至少我建议这样做)并且可以轻松完成,因为 Ext.Ajax.request() 方法支持开箱即用

Ext.Ajax.request({
    url: 'YourURL',
    jsonData: YourObjectRef, // can be any object or JSON string
    success: function(response, opts) {
        // your code
    }
});

如果您想使用商店,请使用Modelfield的auto类型。此类型可以包含任何对象。这是一个 JSFiddle ,其中包含模型中的对象列表。

以下是商店配置的修改。请注意,您可以定义仅read API CRUD API 。对于后者,不可能离开f.e. destroy操作未设置。您还需要知道writer中的根属性意味着您要编码您的数据,这意味着所有内容都通过get发送,这绝对不是您想要的。

现在该代理的功能:默认batch将为true,这将导致商店提交所有< / strong>同步调用时立即更改。如果某个操作有多个更改,则代理将提交一个对象数组而不是一个对象。现在,如果您不关心这一点,现在需要预测是否为每个请求获取了一个对象或一组对象。我们不希望最终出现这样的事情。但是作者的allowSingle属性可以让我们解决这个问题。如果将其设置为true,它将始终将一组对象发送回服务器,即使只有一个。你现在知道每次都得到一个数组。

proxy:{
    type:'ajax',
    api: {
        read:'index.php?r=...',
        create: 'index.php?r=...',
        update: 'index.php?r=...',
        destroy: 'index.php?r=...',
    },
    reader: {
        type:'json',
        root:'data'
    },
    writer: {
        type:'json',
        allowSingle: false
    }   
}

答案 1 :(得分:1)

如果您希望通过单个代理请求从商店提交多条记录作为数组,则应将编辑器配置为 allowSingle 配置为 false 。这将强制您的代理请求将请求对象包装在一个数组中,即使只保存/添加了一个模块实例/等。

http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.writer.Json-cfg-allowSingle

writer: {
    type:'json',
    root:'data',
    allowSingle: false
}