#javascript #knockout.js #signalr
#javascript #knockout.js #signalr
Вопрос:
Я создаю демонстрационное приложение для чата, поскольку пытаюсь изучить сигнал r. Моя проблема в том, что моя клиентская функция javascript не вызывается при попытке из метода connect в классе chathub на сервере.
Функция javascript клиента LoadChatRoomContent выполняется только при запуске страницы. и не тогда, когда я вызываю его из функции концентратора сервера.
Есть идеи?
На стороне клиента
<script type="text/javascript">
**View Model**
var chatViewModel = {
chat: $.connection.chatHub,
connectToLobby: function () {
this.chat.server.connect(this.userName());
},
)
$(function () {
var chat = $.connection.chatHub;
ko.applyBindings(chatViewModel);
// client side signalr functions
chat.client.newUserHasJoined = function (userName) {
//$('#chatContent').append(userName "has joined");
chatViewModel.latestChatContent.append(userName "has joined");
// update the users online list when a new member has joined
chatViewModel.onlineUserList.push(userName);
};
chat.client.loadChatRoomContent = new function (messageHistory, userList) {
// convert json string to javascript array so that it can be iterated.
chatViewModel.onlineUserList = $.parseJSON(userList);
//
chatViewModel.latestChatContent = $.parseJSON(messageHistory);
alert("it works");
};
$.connection.hub.start();
});
**Chat Hub**
public class ChatHub : Hub
{
List<connectedUsers> _currentUsers;
// stores up to 100 messages
List<string> _messageCache;
public ChatHub(){
_currentUsers = new List<connectedUsers>();
_messageCache = new List<string>();
}
public void Connect(string userName)
{
// add new user to the list
lock (_currentUsers)
{
_currentUsers.Add(new connectedUsers() { Id = Guid.NewGuid(), userName = userName });
}
//let other users know of the new member
Clients.AllExcept(Context.ConnectionId).newUserHasJoined(userName);
// send chat messages and current UsersList to caller only
// both objects sent as json string format.
Clients.Caller.loadChatRoomContent( new JavaScriptSerializer().Serialize(_messageCache),new JavaScriptSerializer().Serialize(_currentUsers));
}
}
Комментарии:
1. Я буду рад вам помочь, если вы разделите свой код на блоки, объяснив, что представляет собой каждый блок. Улучшенный вопрос имеет улучшенный ответ.
2.
loadChatRoomContent
находится вConnect
методе, который вызывается только один раз для каждого пользователя после подключения. Я не знаю, как вы ожидаете, что новый контент будет транслироваться всем клиентам, которые считают, что он вложен в функцию Connect?