Javascript mvc中数据的实时插入
我有一个带有评论功能的新闻项目。任何添加评论的人都可以立即看到自己的评论,而无需重新加载页面(使用ajax)。问题是,当user1(例如)在post1上发表评论时,只有user1可以立即看到他的评论,但所有其他用户都需要重新加载页面才能看到user1的评论。我怎样才能解决这个问题 我用于获取注释的代码:Javascript mvc中数据的实时插入,javascript,jquery,asp.net-mvc,real-time,Javascript,Jquery,Asp.net Mvc,Real Time,我有一个带有评论功能的新闻项目。任何添加评论的人都可以立即看到自己的评论,而无需重新加载页面(使用ajax)。问题是,当user1(例如)在post1上发表评论时,只有user1可以立即看到他的评论,但所有其他用户都需要重新加载页面才能看到user1的评论。我怎样才能解决这个问题 我用于获取注释的代码: $(function () { $("#AddComment").click(function () { var CommentText = document.getElementBy
$(function () {
$("#AddComment").click(function () {
var CommentText = document.getElementById("CommetForm").innerHTML;
var UserName = document.getElementById("UserName").innerHTML;
var PostId = document.getElementById("PostId").innerHTML;
$.ajax({
url: '/PostComment/AddComment',
type: 'POST',
dataType: 'json',
cache: false,
data: { "PostId": PostId, "CommentText": OrignalCommentText },
success: function (data)
{
if (data == "P") // Commet Stored on database successfully
{
document.getElementById("PostComments-" + PostId).innerHTML +=
"<li>" +
"<div class='media'>" +
"<div class='media-body'>" +
"<a href='' class='comment-author'>"+UserName+"</a>" +
"<span class='CommetText' id='CommentText-" + PostId + "'>" + CommentText + "</span>" +
"</div>" +
"</div>" +
"</li>";
}
else // Some Error occur during storing database
{
document.getElementById("CommentError-" + PostId).innerHTML = "\nSomething went wrog, please try agin";
}
}
});
});
});
我建议你用信号器来做这个 您可以编写一个JavaScript代码,对检查数据库更新的servlet进行ajax调用。
向ajax调用的成功函数返回一个标志,如果状态已更改或任何注释已添加到数据库中,则可以重新加载页面或用新注释刷新包含注释的页面。它不会在其他页面上发布,因为user1页面正在进行ajax调用,因此它可以正确加载。但是,其他页面并不“知道”它们应该通过AJAX重新加载。您需要运行某种定时循环来检查任何更改。以上任何一个答案都应该适用 TL;DRUse可以使用
setInterval
或来完成此操作。下面我来解释一下
首先,我们需要了解这种发布/订阅模式的背后是什么。由于您希望构建实时应用程序,因此可以创建一个函数,询问服务器自上次检查以来是否添加了某些数据
使用WindowTimers.setInterval()
在我看来,这里是实现这一点的最简单方法,假设这是您第一次使用WebSocket,并且您以前从未使用过WebSocket。例如,在客户端项目中,您在setIntervalsetInterval(checkNewData,time)
中创建了一个函数。您的方法checkNewData()
将向服务器发出ajax请求,询问是否最近添加了一些数据:
function checkNewData() {
// ajax call
// On response, if found some new comment, you will inject it in the DOM
}
然后,在服务器端方法中,获取其调用的时间戳,并在数据库中验证是否存在一些数据。大概是这样的:
// Method written in PHP
public function ajax_checkNewData() {
$time = time();
// Asks to your model controller if has something new for us.
// SELECT comment FROM comments WHERE timestamp > $time
// Then return its response
}
您将使用来自控制器方法ajax\u checkNewData()
的响应在注释容器上写入
使用WebSocket(美丽的方式)
现在,还有另一种方法,使用WebSocket。HTML5WebSocket代表了web通信历史上的第一次重大升级。在WebSocket之前,web客户端和服务器之间的所有通信都只依赖于HTTP。现在,动态数据可以在WebSocket连接上自由流动,这些连接具有持久性(始终打开)、全双工(同时双向)和惊人的速度。在不同的库和框架中,您可以使用。我相信这将很好地解决您的实时应用程序问题,但我不确定您需要更改多少项目以适应此解决方案
查看简单聊天教程,看看它是否适合您的需要。它非常简洁,使用它来实现将是一个很好的挑战。由于它是事件驱动的,我相信您在实现它时不会遇到问题
有关更多信息,请查看:
参考资料
开始:聊天应用程序-
网袋-
网袋-
祝你好运 您可以使用SignalR实现此目的,您可以向服务器发送实时消息,下面是一个示例,了解如何在ASP.NET MVC中实现SignalR
感谢您的重播,但我认为signalr是一个很好的解决方案,但要了解更多有关实时的信息,signalr是最佳还是WebSocket?signalr使用WebSocket传输来发挥其神奇作用。因此,由于您在项目中使用ASP.NET,SignalR最适合您的实时应用程序。如果你对此感到好奇,你可以检查一下,或者我感谢你的帮助。非常感谢。谢谢你的回答,但是如果有很多用户在同一篇帖子上发表评论,定时循环或任何形式的轮询都会耗尽服务器。谢谢,我认为你的解决方案会解决我的问题。肯定是首选的方式
// Method written in PHP
public function ajax_checkNewData() {
$time = time();
// Asks to your model controller if has something new for us.
// SELECT comment FROM comments WHERE timestamp > $time
// Then return its response
}