2014-02-01 1 views
0

У меня есть таблица с продуктами, и я хочу отображать в реальном времени количество голосов для каждого продукта с помощью SignalR. Я не знаю, почему $ .connection.hub.start() внутри jquery «каждый» метод работает неправильно. . Я попытался поставить $ ('тд') каждая функция внутри $ .connection.hub.start(), но странные вещи происходит при отладке метода в хаб:SingalR hub method

<div class="products"> 
    <table class="tableClass"> 
     <tbody> 
      <tr> 
       @foreach (var item in Model.Products) 
       { 
        <td class="@item.Id"> 
         <span class="productId" hidden="hidden">@item.Id</span> 
         <img src="~/Images/imageNotFound.png" style="max-width: 420px; max-height: 420px" /> 
         <span>@item.Name</span> 
         @*@Html.ActionLink("Vote", "AddVote", new { productId = item.Id }, new { type = "button" })*@ 
         <input type="button" class="voteBtn" title="Vote" value="Vote" itemid="@item.Id" /> 
         <br /> 
         <span class="votesAmount"></span> 
        </td> 
       } 
      </tr> 
     </tbody> 
    </table> 
    <span class="messageClass" style="color:red;"></span> 
</div> 

Hub:

public void VotesAmount(int productId, string className) 
{ 
    GetVotesAmountResponse response = VoteService.GetVotesAmount(new GetVotesAmountRequest() { ProductId = productId }); 
    int votesAmount = 0; 
    if (response.Status == true) 
    { 
     votesAmount = response.Amount; 
     Clients.Caller.getVotesAmount(votesAmount, className); 
    } 
    else 
    { 
     Clients.Caller.getVotesAmount(votesAmount, className); 
    } 
} 

Сценарий в виду:

vote.client.getVotesAmount = function (votesAmount, className) { 
    $('td.'+className).find('span.votesAmount').text('VotesAmount: ' + votesAmount + ' ProductID:' + productId); 
}; 

$('td').each(function() { 
    $.connection.hub.start().done(function() { 
    vote.server.votesAmount($(this).find('.productId').text(), $(this).attr('class')); 
    }); 
}) 

Я попытался это тоже (не работает, хотя):

$.connection.hub.start().done(function() { 
    $('td').each(function() { 
     vote.server.votesAmount($(this).find('.productId').text(), $(this).attr('class')); 
    }); 
}); 
+0

Поскольку это не так, как работает, вы должны начать соединение только один раз. – vtortola

+0

Я добавил другой способ сделать это (я обновил текст выше), но он все еще не работает должным образом. Мне нужно получить количество голосов от db для каждого продукта и отображать его в надлежащем диапазоне внутри – tzm

ответ

1

Второй вариант должен работать. Проблема связана с идентификатором продукта в методе обратного вызова.

vote.client.getVotesAmount = function (votesAmount, className) { 
$('td.'+className).find('span.votesAmount').text('VotesAmount: ' + votesAmount + 

'ProductID:' + productId); };

Товарная переменная здесь не доступна внутри этого метода. Поэтому я удалил это, и он сработал. Лучше вы можете присвоить значение или удалить его.

+0

Благодарим за ответ. Я был очень близок к этой работе, но ваш ответ был очень полезен. Спасибо еще раз – tzm