Extjs中的模型如何能从对返回具有多个节点的json的服务的调用中只读取一个字段呢?

1tuwyuhd  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(110)

我想问你一个问题,关于一个模型的使用,这个模型调用一个数据阅读服务,这个服务返回一个json。所有的字段都在模型中声明。当这个模型被用于创建一个商店时,它会调用一个数据读取服务,这个服务以json的格式返回。当删除服务被启动时,它只希望接收ID字段。它会出错,因为sync方法的存储传递了所有字段。我如何确保在调用sync模式时只传递了ID字段?我还通过创建一个只有一个字段的模型进行了测试:
字段:['名字',{类型:'int',名称:'ID' }],即使在模型中只指定了一个字段,存储也会使用来自json的所有字段进行初始化,然后它会正确执行remove方法,但在启动同步时,它会出错,因为所有字段都存在,而不仅仅是ID。
这是模型:
扩展定义('AmpelideWeb.模型. VignaToponimo',{扩展:'放大器Web模型库',

fields: [{
    name: 'ID',
    type: 'int'
},
{
    name: 'CODICE',
    type: 'string'
},{
    name: 'DESCRIZIONE',
    type: 'string'
},{
    name: 'SIAN_CODICE',
    type: 'string'
},{
    name: 'SIAN_EXPFLG',
    type: 'string'
},
{
    name: 'ID_REGIONE',
    type: 'int'
},{
    name: 'ID_PROVINCIA',
    type: 'int'
}],

statics: {
    baseUrl: 'vigne/toponimi'
},

});
这是模型库:
扩展定义('AmpelideWeb.模型.基础',{

extend: 'Ext.data.Model',

identifier: 'negative',

idProperty: 'ID',

inheritableStatics: {
    format: 'json',
    idParam: 'ID',
    readMethod: 'POST',
    costantUrl:'http://192.168.24.8:8080/API/v1/'
},

schema: {
    proxy: {
        type: 'ajax',
        idParam: '{idParam}',
        paramsAsJson: false,
        api: {
            create  : '{costantUrl}'+'{baseUrl}'+'/insert',
            read    : '{costantUrl}'+'{baseUrl}',
            update  : '{costantUrl}'+'{baseUrl}'+'/edit',
            destroy : '{costantUrl}'+'{baseUrl}'+'/delete'
        },
        actionMethods: {
            create: 'POST',
            read: '{readMethod}',
            update: 'POST',
            destroy: 'POST'
        },
        reader: {
            type: '{format}'
        },
        writer: {
            //rootProperty:'',
            type: '{format}',
            writeAllFields: true,
            allowSingle: false,
        },

    }
}

});
这是删除方法:
删除时单击:函数(){

var form = Ext.getCmp('DettaglioVignaToponimo');

    let vignaToponimoIdDelete = this.vignaToponimoId;

    let store = Ext.create('Ext.data.Store', {
        model: 'AmpelideWeb.model.VignaToponimoDelete',

    });

    store.load();

    store.proxy.paramsAsJson = true;

    if (form.getValues().ID!==null){

        Ext.Msg.confirm('Eliminazione Vigne Toponimi', 'Se sicuro di voler eliminare il dato selezionato ?', function (id, value) {    

            if (id === 'yes') {

                store.proxy.headers = {'Content-Type': 'application/x-www-form-urlencoded'};

                const record = new AmpelideWeb.model.VignaToponimoDelete({ID: vignaToponimoIdDelete});

                store.remove(record);

                store.sync({                         
                    success: function (batch) {

                        Ext.Msg.alert('Eliminazione dati Vigne Toponimi!', 'Eliminazione Vigne Toponimi avvenuta correttamente', function (btn) {                                                
                        });
                    },
                    failure: function (batch, opt) {
                        responseObj = batch.exceptions[0].error.response.responseJson;

                        Ext.Msg.alert('Eliminazione Vigne Toponimi fallita', 'messaggio di errore: ' + responseObj.message);
                    }

                });

            }else{
                return false;
            }

        })
    }else{
        Ext.Msg.alert('Eliminazione Vigne Toponimi fallito', 'messaggio di errore: ID Vigne Toponimi è null, nessun dato da eliminare.');
    }

},
rggaifut

rggaifut1#

即使在模型中只指定了一个字段,存储也会使用来自json的所有字段进行初始化,然后它会正确执行remove方法,但在启动sync时,它会出错,因为所有字段都存在,而不仅仅是ID。
两件事:Ext动态地将字段添加到基于数据的模型中。它鼓励不维护字段元数据,并使其更灵活。writeAllFields为true,这就是为什么代理发送所有参数。
writeAllFields只对UPDATE操作有意义,但无论如何,我们在这里没有对请求类型控制。
据我所知,你想在发送请求之前处理数据。我认为Ext.data.writer.Writer的转换将是一个很好的方法。
你可以在作家它像下面这样:

writer: {
    type: 'json',
    transform: function(data, request) {
        var requestAction = request.getAction(),
            serialized;

        // keep only id if a delete operation
        serialized = (requestAction == "delete") ? { id: data.id } : data;

        return serialized;
    }
}

小提琴链接

相关问题