【发布时间】: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