Я добавляю все свои клиентские методы, прежде чем позвонить.start().
То, что я делаю, это загрузить проводку всех клиентских методов, и у меня есть setTimeout в течение 5 секунд, чтобы на самом деле вызвать.start(), поэтому я знаю, что весь мой клиентский скрипт подключен.
По какой-то причине сценарий подключается, но не будет называться сервером.
Теперь я могу без проблем запускать методы сервера, мне просто нужен сервер для передачи этого сообщения клиентам, через клиентский скрипт.
Можно ли разместить клиентский скрипт внутри именованных объектов функции?
Я удалил много кода, чтобы он был читабельным.
Это работает, потому что я вызываю сервер.
$.connection.hub.proxies.collaboratorhub.server.sendMsg
-
Это не работает, потому что я жду на сервере отправки клиенту его сообщения
$.connection.hub.proxies.collaboratorhub.client.receiveMsg
знак равно
На стороне сервера при отладке я получаю sentMsg от клиента к серверу, и receiveMsg вызывается с сервера, но он никогда не делает его клиенту.
function ChatBox(collaboratorMenuItem) {
var
sendMsg = function (ev) {
// If the user has pressed enter
if (ev.keyCode === 13) {
if (this.value.trim() === '') { return false; };
var avatar = attendees.querySelector('.' + meAttendee.profile.UserID);
if (avatar) {
chats.appendChild(
docCreateAttrs('div', { 'class': 'collabChat', innerHTML: this.value }).addChild(avatar.cloneNode(true))
);
} else {
chats.appendChild(
docCreateAttrs('div', { 'class': 'collabChat', innerHTML: this.value })
);
};
$.connection.hub.proxies.collaboratorhub.server.sendMsg({ msg: this.value });
this.value = '';
return false;
} else { return true; };
},
debugger
//Callbacks that are called from the server. Not intended for local function calls
$.connection.hub.proxies.collaboratorhub.client.receiveMsg = function (cmsg) {
var avatar = attendees.querySelector('.' + cmsg.uid);
if (avatar) {
chats.appendChild(
docCreateAttrs('div', { 'class': 'collabChat', innerHTML: cmsg.msg }).addChild(avatar.cloneNode(true))
);
} else {
chats.appendChild(
docCreateAttrs('div', { 'class': 'collabChat', innerHTML: cmsg.msg })
);
};
};
$.connection.hub.proxies.collaboratorhub.client.addCurrAttendee = function (attendee) {
debugger
addAttendee(attendee);
};
$.connection.hub.proxies.collaboratorhub.client.joined = function (attendee) {
debugger
addAttendee(attendee);
//let the new attendee know about you
if (attendee.cnnid !== meAttendee.cnnid) {
meAttendee.newbieid = attendee.cnnid;
//
this.server.addMeNewbie(meAttendee);
};
};
$.connection.hub.proxies.collaboratorhub.client.rejoined = function (attendee) {
debugger
//console.log('Re joined : ' + attendee.cnnid);
addAttendee(attendee);
//let the new attendee know about you
if (attendee.cnnid !== meAttendee.cnnid) {
meAttendee.newbieid = attendee.cnnid;
this.server.addMeNewbie(meAttendee);
};
};
$.connection.hub.proxies.collaboratorhub.client.gone = function (attendee) {
// console.log('gone : ' + attendee.cnnid);
removeAttendee(attendee);
};
collaboratorMenuItem.onclick = function (e) {
//debugger
if (!chatBox.parentNode) {
var xy = e.target.getBoundingClientRect();
document.body.appendChild(chatBox.setGX(null, xy.left).setGY(null, xy.height));
$(chatBox).draggable({ handle: chatHead, cursor: "move" }).css('position', 'absolute').resizable();
} else {
removeChat();
};
};
return {
chatBox: chatBox,
attendLk: attendLk,
addAttendee: addAttendee,
removeAttendee: removeAttendee,
removeChat: removeChat
};
};
--This как создать имя функции с именем collaborateManager
, что когда экземпляр имеет свойство вызова this.chatBox
и это где все клиентский сценарий загружается вверх, с-в ChatBox
.
CollatorMenuItem - это просто div, который расположен рядом с ChatBox.
function collaborateManager(collaboratorMenuItem) {
this.chatBox = new ChatBox(collaboratorMenuItem);
}
return {
hideCollaborator: hideCollaborator,
showCollaborator: showCollaborator,
getCollaborator: getCollaborator,
removeCollaboratorCollaborators: removeCollaborator
};
И в другом глобальном файле JS я запускаю соединение через пять секунд.
document.bindReady(function () {
setTimeout(function () {
//Global SignalR Connections State
var cnnStateChanged = function (change) {
if (change.newState === $.signalR.connectionState.reconnecting) {
console.log('Re-connecting');
}
else if (change.newState === $.signalR.connectionState.connected) {
console.log('The server is online');
}
else if (change.newState === $.signalR.connectionState.disconnected) {
console.log('The server is offline');
};
},
cnnReconnected = function (change) {
if (change && change.newState === $.signalR.connectionState.reconnected) {
};
console.log('The server is re-connected');
};
//------------------------------------------------------------------------------------------------------------
//Global start SignalR connectio
$.connection.hub.stateChanged(cnnStateChanged);
$.connection.hub.reconnected(cnnReconnected);
if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
$.connection.hub.start().done(function () {
//debugger
// onConnected();
});
} else {
//debugger
// onConnected();
};
},5000);
});
Соединение запускается правильно каждый раз, это не проблема, я могу также отправлять сообщения сервера, мне нужно иметь возможность получать эти сообщения.
Вот моя sendMsg на стороне сервера, которая вызывается, но ни один клиент никогда не получает acceptMsg()
public Task sendMsg(Cmsg cmsg)
{
string pid = this.Context.QueryString["pid"],
uid = this.Context.QueryString["uid"];
//
cmsg.cnnid = Context.ConnectionId;
cmsg.uid = uid;
//614
return Clients.OthersInGroup(pid).receiveMsg(cmsg);
}
Какие-либо предложения? Я делаю это неправильно?
Попробуйте изменить код на стороне сервера, чтобы:
public Task sendMsg(Cmsg cmsg)
{
string pid = this.Context.QueryString["pid"],
uid = this.Context.QueryString["uid"];
//
cmsg.cnnid = Context.ConnectionId;
cmsg.uid = uid;
//614
return Clients.Caller.OthersInGroup(pid).receiveMsg(cmsg);
}
Добавление вызывающего абонента в: возврат клиентов. Caller.OthersInGroup(pid).receiveMsg(cmsg);