2017-05-03 8 views
0

ページに50件の投稿があるとします。各投稿にいくつかのコメントが含まれています。 投稿をクリックするとコメント付きのポップアップが表示されます。signalr接続されたクライアントに、特定の投稿内にコメントを送信します。

何が起こっているかは、2人のユーザーがサーバーに接続している場合です。 1人はポスト1を見ていて、もう1人はポスト34を見て、それぞれがコメントを送って、コメントが交換されました。

特定の投稿IDがポップアップウィンドウのコメント用に開かれている場合にのみ、その投稿を送信するように信号機に指示することはできますか?私はこれに新しいです。任意のポインタが行います。

これは私の作業コード

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> 

これは簡単な解決策としての私のchathub

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; 
    } 
} 
+0

で、ユーザグループの複数の管理方法については、このlinkに従うことができます。誰かが1つの投稿(コメントポップアップ)にいるとき、そのポストのみに関連する更新/プッシュ/ポストを取得します –

+0

ユーザーがポップアップを開くと、接続が作成され、そのグループに使用が追加されますか?ポップアップを閉じると、彼は取り除かれましたか? – maztt

+0

はい。これはまさに事です。また、私は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); 
    } 
} 

このように、オンラインユーザーはすべて新しいコメントを受け取りますが、その投稿を表示しているユーザーのみが表示できます。

それとも、私たちは各ポストのためのdiffのグループ/チャンネルを作成することによって、それを行うことを計画しているどのようにサーバー側

関連する問題