开发者

extjs4 - is there a non json/xml writer for proxies?

I'm building some models to interact with an existing API from a previous project.

The API relies on standard POST methods to save the data.

I've configured a model and proxy up to the point where it does push the data onto the server but there only seems to be two writer types, json & xml.

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

Isn't there a standard POST writer that simply submits data 开发者_如何学Cin post fields?

I'm surprised that wouldn't be a standard writer type.

(Parsing the json format wouldn't be too hard to implement but that would mean updating a lot of the old api files.)


Ok, I was able to create that writer quite easily by checking the existing writers' source code.

One thing those existing writers are able to do - and that may be why the dev team only implemented a json and xml version - is that they can push multiple records at once.

That could be implemented in POST but would be a bit more complicated.

This writer will work if you're trying to push a single model to an api using POST:

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

and the use this for the writer in the proxy:

writer: {
            type: 'singlepost'
        }


Based on Ben answer I've implemented my own writer that will collect all properties of all models into arrays. For example if you have model like with some fields:

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

A request string will be

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

Code:

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


For Sencha touch 2.0, change the writeRecords method to:

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


Here's my version, adapted from answers above:

// 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'
        }
    }

});
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜