【问题标题】:Temporary disable server processing on datatables临时禁用对数据表的服务器处理
【发布时间】:2016-11-09 15:30:31
【问题描述】:

我有一个由服务器端数据加载的数据表,一切正常。现在,我想通过侦听来自 AWS SQS 的通知来更新数据行,当我获取新的行数据并添加到表 API 然后调用“draw”方法时,API 会从服务器端触发 ajax 刷新(表已通过服务器处理设置)。

有办法暂时“禁用”ajax 调用吗?因为,我不想一直禁用,我希望服务器端处理分页和搜索,只想添加我的新行而不调用服务器。

我试试这个:

var table = $('#tblModel').DataTable(); // Get the API object

// Initialize the Amazon Cognito credentials provider
AWS.config.region = 'us-west-2'; // Region

/**
 * Gets the user's Identity
 */
$.getJSON("/cognito", function(data) {
    if (data) {
        IdentityId = data.IdentityId;
        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: IdentityPoolId,
            IdentityId: data.IdentityId,
            Logins: {
                "cognito-identity.amazonaws.com": data.Token
            }
        });

        var queue = new AWS.SQS({params: {QueueUrl: QueueUrl, WaitTimeSeconds: 20}}); // using url to queue
        getMessages(queue);
    }
});

/**
 * Gets the message from SQS
 */
function getMessages(queue) {
    queue.receiveMessage(function (err, data) {
        if (data) {
            if (data.Messages.length == 0) return;
            try {
                // here add a row or rows, but it trigger a call to refresh data from server side instead.
                if (data.Messages.length > 1)
                     table.rows.add(data.Messages.map(transformMessage)).draw();
                else 
                        table.row.add(transformMessage(data.Messages[0])).draw();

                // now delete the messages
                queue.deleteMessageBatch({
                    QueueUrl: QueueUrl,
                    Entries: data.Messages.map(function(Message) {
                        return {
                            Id: Message.MessageId,
                            ReceiptHandle: Message.ReceiptHandle
                        };
                    })
                }, function(err, data) {
                    if (err) console.error(err);
                });

                getMessages(queue);
            } catch (e) {
                console.error(e);
            }
        }
    });
}

【问题讨论】:

  • 你不能只使用一个boolean 变量来存储你是否应该执行ajax 吗?然后在要打开或关闭ajax时设置boolean,并在运行ajax的函数中检查boolean
  • @KevinWorkman 这似乎是恕我直言的答案
  • @KevinWorkman 我不这么认为,因为在 DataTables 中,ajax 功能在设置时被激活: $('#tblModel').dataTable({ ajax: "/path/to/data", .... });并且在页面渲染上必须是这样才能获取数据。所以,我认为这并不容易

标签: jquery ajax server datatables


【解决方案1】:

我得到了解决方案,如果有人想要它:如果你想临时禁用 ajax 请求必须设置两个设置标志:oFeatures.bServerSide 和 ajax。

// here temporary disable ajax
table.settings()[0].oFeatures.bServerSide = false;
table.settings()[0].ajax = false;

if (data.Messages.length > 1)
    table.rows.add(data.Messages.map(transformMessage)).draw();
else 
    table.row.add(transformMessage(data.Messages[0])).draw();

// here activate it again
table.settings()[0].oFeatures.bServerSide = true;
table.settings()[0].ajax = sUrlServerList;

【讨论】:

  • 我对这个解决方案有一些“逻辑问题”,它禁用了表格,但也重置了有关分页的信息。
  • 太棒了!你节省了我很多时间!这是工作!
  • 优秀。你是国王。
  • 什么是 sUrlServerList? @GroverManuelCamposAncajima
  • 是一个常量,包含我/你的 URL,它将获取行
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多