ajax请求 - 没有表单的更新记录

时间:2016-01-12 15:50:15

标签: javascript ajax extjs extjs5

要进行记录更新,我通常使用CRUD和这样的商店:

        storeId: 'storeId',
        model: 'model',
        pageSize: 10,
        autoLoad: true,

        proxy: {
            type: 'ajax',

            actionMethods: {
                create: 'POST',
                read: 'POST',
                update: 'POST',
                destroy: 'POST'
            },

            api: {
                create: 'php/crud.php?action=create',
                read: 'php/crud.php?action=read',
                update: 'php/crud.php?action=update',
                destroy: 'php/crud.php?action=destroy'
            },

            reader: {
                type: 'json',
                rootProperty: 'net',
                totalProperty: 'total',
                successProperty: 'success'
            },

            writer: {
                type: 'json',
                writeAllFields: true,
                encode: true,
                rootProperty: 'net'
            }
        }

更新的逻辑:

    var record = form.getRecord();
    record.set(values);

    store.sync({
        success: function () {

        },

        failure: function () {

        },

        callback: function () {
        },

    });

问题:只需更改数据库列的值:YES / NO

我没有使用' destroy'删除记录,而是想通过更新'来禁用它。数据库表列形式NO为YES。

在这种情况下我没有形式;只是一个删除按钮。

我尝试没有成功:

    store.proxy.extraParams = {
           sub_case: 'change_delete_state',
           id_lista: id_lista
    },

    store.sync({
        success: function () {

        },

        failure: function () {

        },

        callback: function () {
        },

    });

    Ext.Ajax.request({
        url: 'php/crud.php?action=update',
        params: {
           sub_case: 'change_delete_state',
           id_lista: id_lista
        },
        success: function () {
            store.commitChanges();
        },

        failure: function () {

        },

        callback: function () {
        },
    });

我很感激解决这个问题的建议。

编辑:

像这样解决:

    api: {
        destroy: 'php/crud.php?action=destroy'
    },

客户端逻辑:

        // soft delete
        store.proxy.extraParams = {
           sub_case: 'change_delete_state',
           id_lista: id_lista
        },

        //or
        // hard delete
        store.proxy.extraParams = {
           id_lista: id_lista
        },

        store.remove(record);
        store.sync({...});

服务器端(PHP):

case "destroy":{
    $record = stripslashes($_POST['net']);
    $data = json_decode($record);

    $id_lista = $data->{'id_lista'};

  if($_REQUEST['sub_case'] == "change_delete_state"){      
        $sqlQuery = "UPDATE ...";
        (...)
    }else{
        $sqlQuery = "DELETE ...";
        (...)
      }
}

1 个答案:

答案 0 :(得分:1)

如果你尽可能地隐藏服务器端的数据库逻辑,你就会很好。

所以,如果你只有一种方法可以摆脱前端的记录,并且记录应该从商店中删除,你只需要用一个特殊的“特殊”商店来交换destroy api。 API:

        api: {
            create: 'php/crud.php?action=create',
            read: 'php/crud.php?action=read',
            update: 'php/crud.php?action=update',
            destroy: 'php/crud.php?action=hide' // hide the record using a SQL update, and remove it from the client-side store; don't remove from server
        },

当然,您必须在crud.php中插入特殊逻辑才能对action=hide进行特殊处理。

如果你想有两种不同的方式,一种用于“硬删除”,一种用于“软删除”,但两者都应该从商店中删除,事情变得有点复杂。然后,您需要在服务器端处理的记录中使用特殊的布尔“标志”。

E.g。

fields:[{
    name:'hardDelete',
    type:'bool',
    defaultValue:false
}]

然后你会做某事。沿

if(hardDelete) record.set("hardDelete",true);
store.remove(record);
store.sync(

在服务器端,您必须阅读该标志并根据其值进行操作。