【问题标题】:signalr send comment to connected client but within specific post信号器向连接的客户端发送评论,但在特定帖子中
【发布时间】: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


【解决方案1】:

作为一个简单的解决方案,您可以这样做。

// save opened/clicked post ID into a local variable (clear when closed)
var currentPostID = 22;

// in your signalr receive event
self.hub.client.newCommentss = function(comment) {
  // assuming cardid is postID
  if(currentPostID == comment.cardid) {
    self.comments.push(comment);
  }
}

这样每个在线用户都会收到新评论,但只有查看该帖子的人才能看到它。

或者您可以关注此link 以在服务器端进行更多管理的用户分组方式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多