Новое в SignalR, есть ли способ вещать другим, пока пользователь выполняет действие, а не только когда он начинает и заканчивает? - PullRequest
0 голосов
/ 24 апреля 2019

Итак, я пытаюсь сделать небольшой пример проекта, когда пользователь редактирует ячейку в таблице, эта ячейка отключается для всех остальных на этой странице.Все хорошо.Здесь я настроил его так, чтобы при входе пользователя в ячейку он отключался для всех остальных, а при размытии / выходе из ячейки он очищался.Теперь проблема в том, что если человек находится в камере, он отключается на экранах других людей.Но если кто-то обновляется или новый пользователь заходит на страницу, он не отключается, даже если основной пользователь все еще находится в этой ячейке.Есть ли способ с SignalR узнать, что кто-то использует определенную ячейку во время его использования, а не только когда он входит / выходит из ячейки?

C # Код:

    public class ChatHub : Hub
    {
        public void Send(string name, string message, bool boolean)
        {
            // Call the broadcastMessage method to update clients.
            Clients.Others.broadcastMessage(name, message, boolean);
        }
    }

HTMLКод:

<table id="table">
    <thead>
        <tr>
            <th>HeaderOne</th>
            <th>HeaderTwo</th>
            <th>HeaderThree</th>
        </tr>
    </thead>
    <tbody>
        @for(int i = 0; i < 3; i++)
        {
        <tr>
            <td><input class="tdInput" /></td>
            <td><input class="tdInput" /></td>
            <td><input class="tdInput" /></td>
        </tr>
        }
    </tbody>
</table>

Код Javascript:

        $(function () {
            var conn = $.connection.chatHub;

            conn.client.broadcastMessage = function (col, row, boolean) {
                var cell = $("#table tr:eq(" + row + ") td:eq(" + col + ")");
                cell.find("input").prop('disabled', boolean);
            };

            $.connection.hub.start().done(function () {
                $(".tdInput").on('focus', function () {
                    var col = $(this).parent().index();
                    var row = $(this).closest('tr').index() + 1;
                    conn.server.send(col, row, true);
                });
                $(".tdInput").on('blur', function () {
                    var col = $(this).parent().index();
                    var row = $(this).closest('tr').index() + 1;
                    conn.server.send(col, row, false);
                });
            });
        });

Вот простая реализация варианта # 2 из комментария Кристофа:

В connection.hub.start (),добавить:

conn.server.refresh();

в JS:

conn.client.resendStatus = function () {
    if ($('input:focus').length > 0) {
        var focused = $(":focus");
        var col = focused.parent().index();
        var row = focused.closest('tr').index() + 1;
        conn.server.send(col, row, true);
    }
};

в хабе:

public void Refresh()
{
    Clients.Others.resendStatus();
}

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Вы можете добавить setTimeout, это будет отправлять блокировку / статус каждую секунду, пока пользователь не окажется в ячейке.

$(function () {
    var conn = $.connection.chatHub;

    conn.client.broadcastMessage = function (col, row, boolean) {
        var cell = $("#table tr:eq(" + row + ") td:eq(" + col + ")");
        cell.find("input").prop('disabled', boolean);
    };

    $.connection.hub.start().done(function () {
        var flag=false;
        $(".tdInput").on('focus', function () {
            flag=true;
            while(flag)
            {
                setTimeout(function(){
                    var col = $(this).parent().index();
                    var row = $(this).closest('tr').index() + 1;
                    conn.server.send(col, row, true);
                },1000);
            }
        });

        $(".tdInput").on('blur', function () {
            flag=false;
            var col = $(this).parent().index();
            var row = $(this).closest('tr').index() + 1;
            conn.server.send(col, row, false);
        });
    });
});
1 голос
/ 24 апреля 2019

На мой взгляд, есть два возможных решения:

  1. Отслеживание всех заблокированных ячеек на сервере и пометка их как заблокированных, когда пользователь загружает страницу.
  2. После загрузки страницы отправьте широковещательную рассылку всем клиентам, попросив их повторно отправить их текущее состояние редактирования.

Второй вариант проще в обращении, так как вам не нужно отслеживать состояние, и, в частности, нет таймаутов. Однако после загрузки страницы у вас будет короткий период, когда ячейки, отредактированные другими пользователями, временно разблокированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...