extjs4 - есть ли не JSON / XML писатель для прокси? - PullRequest
8 голосов
/ 14 сентября 2011

Я строю некоторые модели для взаимодействия с существующим 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 ]

5 голосов
/ 14 сентября 2011

Хорошо, я смог довольно легко создать этого писателя, проверив исходный код существующих писателей.

Одна вещь, которую могут сделать существующие авторы - и, возможно, поэтому команда разработчиков реализовала только версии json и xml - это то, что они могут выдвигать несколько записей одновременно.

Это может быть реализовано в POST, но будет немного сложнее.

Этот писатель будет работать, если вы пытаетесь передать одну модель в API с помощью 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;
    }
});

и использование этого для писателя в прокси:

writer: {
            type: 'singlepost'
        }
1 голос
/ 30 июня 2012

Для Sencha touch 2.0 измените метод writeRecords на:

writeRecords: function (request, data) {
        var params = request.getParams() || {};
    Ext.apply(params, data[0]);
    request.setParams(params);
    return request;
}
1 голос
/ 22 марта 2012

Основываясь на ответе Бена, я реализовал свой собственный писатель, который будет собирать все свойства всех моделей в массивы.Например, если у вас есть модель, например, с некоторыми полями:

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;
    }
});
0 голосов
/ 01 апреля 2013

Вот моя версия, адаптированная из ответов выше:

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

});
...