extjs4 - 是否有代理的非json / xml编写器?

时间:2011-09-14 13:23:07

标签: extjs extjs4

我正在构建一些模型来与之前项目中的现有API进行交互。

API依赖于标准的POST方法来保存数据。

我已经将模型和代理配置到将数据推送到服务器的位置,但似乎只有两种编写器类型,json& XML。

proxy: {
        /* ... */
        reader: {
            type: 'json',
            root: 'results'
        },
        writer: {
            type: '???' // <-- can only see json or xml in the docs
        }
    }

是否有标准的POST编写器只是在帖子字段中提交数据?

我很惊讶不会是标准的作家类型。

(解析json格式不会太难实现,但这意味着要更新很多旧的api文件。)

4 个答案:

答案 0 :(得分:5)

好的,通过检查现有的编写器源代码,我能够非常轻松地创建该编写器。

现有编写者能够做的一件事 - 也就是开发团队只实现了json和xml版本的原因 - 他们可以一次推送多个记录。

这可以在POST中实现,但会有点复杂。

如果您尝试使用POST将单个模型推送到api,那么本作者将会工作:

Ext.define('Ext.data.writer.SinglePost', {
    extend: 'Ext.data.writer.Writer',
    alternateClassName: 'Ext.data.SinglePostWriter',
    alias: 'writer.singlepost',

    writeRecords: function(request, data) {
        request.params = data[0];
        return request;
    }
});

并将其用于代理中的编写器:

writer: {
            type: 'singlepost'
        }

答案 1 :(得分:1)

根据Ben的回答,我实现了自己的编写器,将所有模型的所有属性收集到数组中。 例如,如果您的模型与某些字段类似:

fields:[
  {name:'id', type:'int'}
  {name:'name', type:'string'}
  {name:'age', type:'date'}
]

请求字符串将是

id=1&id=2&id=...&name=oleks&name=max&name=...&age=...

代码:

Ext.define('Ext.data.writer.SinglePost', {
    extend: 'Ext.data.writer.Writer',
    alternateClassName: 'Ext.data.SinglePostWriter',
    alias: 'writer.singlepost',
    writeRecords: function(request, data) {
        if(data && data[0]){
            var keys = [];
            for(var key in data[0]){
                keys.push(key);
            }
            for(var i=0;i<keys.length;i++){
                request.params[keys[i]] = [];
                for(var j=0;j<data.length;j++){
                request.params[keys[i]].push((data[j])[keys[i]]);
            }
        }
        }
        return request;
    }
});

答案 2 :(得分:1)

对于Sencha touch 2.0,将writeRecords方法更改为:

writeRecords: function (request, data) {
        var params = request.getParams() || {};
    Ext.apply(params, data[0]);
    request.setParams(params);
    return request;
}

答案 3 :(得分:0)

这是我的版本,改编自上面的答案:

// Subclass the original XmlWriter
Ext.define('MyApp.utils.data.writer.XmlInAPostParameter', {

    extend : 'Ext.data.writer.Xml',

    // give it an alias to use in writer 'type' property
    alias : 'writer.xml_in_a_post_parameter',

    // override the original method
    writeRecords : function(request, data) {

        // call the overriden method - it will put the data that I 
        //   want into request.xmlData
        this.callParent(arguments);

        // copy the data in request.xmlData. In this case the XML 
        // data will always be in the parameter called 'XML'
        Ext.apply(request.params, {
            XML: request.xmlData
        });

        // Already copied the request payload and will not send it, 
        //   so we delete it from the request
        delete request.xmlData;

        // return the modified request object
        return request;
    }
});

Ext.define("MyApp.model.MyModel", {
    extend : "Ext.data.Model",
    requires : [ 
        'MyApp.utils.data.writer.XmlInAPostParameter' 
    ],

    fields : [ 'field_A', 'field_B' ],

    proxy : {
        type : 'ajax',

        api : {
            read : '/mymodel/read.whatever',
            update : '/mymodel/write.whatever'
        },

        reader : {
            type : 'xml'
        },
        writer : {

            // use the alias we registered before
            type : 'xml_in_a_post_parameter'
        }
    }

});