【发布时间】:2017-10-01 01:21:00
【问题描述】:
假设页面上有 50 个帖子。每个帖子都包含一些 cmets。 当我点击一个帖子时,会出现一个带有 cmets 的弹出窗口。
发生的情况是,如果两个用户连接到服务器。一个在看帖子1,另一个在看帖子34,每个人都发表评论,cmets被交换了。
当且仅当在弹出窗口中为 cmets 打开特定的帖子 ID 时,我如何告诉 Signalr 将帖子发送给对方?我是新来的。任何指针都可以。
这是我的工作代码
var viewModel = function() {
var self = this;
self.hub = $.connection.chathub;
self.commenttext = ko.observable();
self.comments = ko.observableArray();
self.commentdate = ko.observable();
self.init = function() {
self.hub.server.getPosts().fail(function(err) {
console.log("connection started");
});
}
self.hub.client.loadPosts = function(data) {
ko.mapping.fromJS(data, {}, self.comments);
}
self.hub.client.newCommentss = function(comment) {
self.comments.push(comment);
}
self.addcomments = function() {
var t = {
"comment": self.commenttext(),
"cardid": 20
};
$.ajax({
url: "@Url.Action("
AddComments ", "
Home ")",
type: "post",
contentType: "application/json",
data: JSON.stringify(t),
success: function(data) {
self.hub.server.addCommentss(t).done(function(comment) {
}).fail(function(err) {
});
}
});
}
};
var vm = new viewModel();
ko.applyBindings(vm);
$.connection.hub.start().done(function() {
vm.init();
});
<div id="div1">
<textarea data-bind="value: commenttext"></textarea><br />
<a href="#" data-bind="click: addcomments" style="margin-bottom:4em">Send</a><br /><br /><br />
<ul data-bind="foreach: comments,visible: comments().length > 0">
<li>
<span data-bind="text:commentdate"></span>
<strong><span data-bind="text: comment"> </span></strong><br /><br />
</li>
</ul>
</div>
这是我的聊天室
public class chathub : Hub
{
private readonly ApplicationDbContext _context;
public chathub(ApplicationDbContext context)
{
_context = context;
}
public void GetComments(int id)
{
List<CommentsViewModel> commentss= new List<CommentsViewModel>();
var comments = _context.Comments.Where(m => m.cardid == id);
foreach (var item in comments)
{
CommentsViewModel b = new CommentsViewModel();
b.commentid = item.commentid;
b.comment = item.comment;
b.commentdate = item.commentdate;
b.cardid = item.cardid;
commentss.Add(b);
}
Clients.All.loadComments(commentss);
}
public bool addCommentss(Comment newComment)
{
Comment commentobj = new Comment();
commentobj.comment = newComment.comment;
commentobj.commentdate = System.DateTime.Now;
commentobj.cardid = newComment.cardid;
_context.Add(commentobj);
_context.SaveChanges();
Clients.All.newCommentss(commentobj);
return true;
}
public bool removeCommentss(int id)
{
Comment commentobject = _context.Comments.FirstOrDefault(m => m.commentid == id);
if (commentobject != null)
{
_context.Comments.Remove(commentobject);
_context.SaveChanges();
}
// return Json(true);
Clients.All.deleteCommentss(commentobject);
return true;
}
}
【问题讨论】:
-
我们计划如何通过为每个帖子创建差异组/频道来做到这一点。当某人在一个帖子(cmets 弹出窗口)上时,他将获得仅与该帖子相关的更新/推送/帖子
-
当用户打开一个弹出窗口时,将创建一个连接并将用户添加到组中?当他关闭弹出窗口时,他被删除了?
-
是的。这正是问题所在。我还记得在信号器中创建一个单独的组是没有开销的。
-
@Parv Sharma 如何从组中删除连接?
标签: javascript c# asp.net-mvc knockout.js signalr